aboutsummaryrefslogtreecommitdiff
path: root/modutils/modutils.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2015-11-05 18:54:55 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2015-11-05 18:54:55 +0100
commit48dc80bbba994eee24ed94ae4532a1cce76d7cb7 (patch)
tree051e7aacf5538ffc07310bb4261a693a047311d2 /modutils/modutils.c
parent34adecc2b049f6941c5e075ffb58fe2183823da3 (diff)
downloadbusybox-w32-48dc80bbba994eee24ed94ae4532a1cce76d7cb7.tar.gz
busybox-w32-48dc80bbba994eee24ed94ae4532a1cce76d7cb7.tar.bz2
busybox-w32-48dc80bbba994eee24ed94ae4532a1cce76d7cb7.zip
modutils: merge module_entry and module_info to common
This merges the in-memory module info structures of modprobe and depmod. This allows sharing hashing by modulename code improving depmod runtime with almost factor of 2x. function old new delta get_or_add_modentry - 17 +17 do_modprobe 590 601 +11 moddb_get_or_create - 10 +10 load_modules_dep 195 205 +10 moddb_get - 7 +7 add_probe 81 78 -3 modprobe_main 721 714 -7 depmod_main 553 543 -10 config_file_action 434 421 -13 helper_get_module 160 144 -16 parse_module 343 320 -23 order_dep_list 105 82 -23 ------------------------------------------------------------------------------ (add/remove: 3/0 grow/shrink: 2/7 up/down: 55/-95) Total: -40 bytes Signed-off-by: Timo Teräs <timo.teras@iki.fi> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils/modutils.c')
-rw-r--r--modutils/modutils.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/modutils/modutils.c b/modutils/modutils.c
index ef4134af5..8e9eef72d 100644
--- a/modutils/modutils.c
+++ b/modutils/modutils.c
@@ -16,6 +16,57 @@ extern int delete_module(const char *module, unsigned int flags);
16# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) 16# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
17#endif 17#endif
18 18
19static module_entry *helper_get_module(module_db *db, const char *module, int create)
20{
21 char modname[MODULE_NAME_LEN];
22 struct module_entry *e;
23 unsigned i, hash;
24
25 filename2modname(module, modname);
26
27 hash = 0;
28 for (i = 0; modname[i]; i++)
29 hash = ((hash << 5) + hash) + modname[i];
30 hash %= MODULE_HASH_SIZE;
31
32 for (e = db->buckets[hash]; e; e = e->next)
33 if (strcmp(e->modname, modname) == 0)
34 return e;
35 if (!create)
36 return NULL;
37
38 e = xzalloc(sizeof(*e));
39 e->modname = xstrdup(modname);
40 e->next = db->buckets[hash];
41 db->buckets[hash] = e;
42 e->dnext = e->dprev = e;
43
44 return e;
45}
46module_entry* FAST_FUNC moddb_get(module_db *db, const char *module)
47{
48 return helper_get_module(db, module, 0);
49}
50module_entry* FAST_FUNC moddb_get_or_create(module_db *db, const char *module)
51{
52 return helper_get_module(db, module, 1);
53}
54
55void FAST_FUNC moddb_free(module_db *db)
56{
57 module_entry *e, *n;
58 unsigned i;
59
60 for (i = 0; i < MODULE_HASH_SIZE; i++) {
61 for (e = db->buckets[i]; e; e = n) {
62 n = e->next;
63 free(e->name);
64 free(e->modname);
65 free(e);
66 }
67 }
68}
69
19void FAST_FUNC replace(char *s, char what, char with) 70void FAST_FUNC replace(char *s, char what, char with)
20{ 71{
21 while (*s) { 72 while (*s) {