Restructure code to better integrate future improvements. This work was supported by a hardware donation from the CE Linux Forum. Signed-off-by: Alessio Igor Bogani <abogani@xxxxxxxxxx> Signed-off-by: Anders Kaseorg <andersk@xxxxxxxxxxx> --- kernel/module.c | 75 ++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 55 insertions(+), 20 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index d5938a5..b438b25 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -235,28 +235,28 @@ extern const unsigned long __start___kcrctab_unused_gpl[]; #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL) #endif -static bool each_symbol_in_section(const struct symsearch *arr, - unsigned int arrsize, - struct module *owner, - bool (*fn)(const struct symsearch *syms, - struct module *owner, - unsigned int symnum, void *data), - void *data) +static bool each_symsearch_in_section(const struct symsearch *arr, + unsigned int arrsize, + struct module *owner, + bool (*fn)(const struct symsearch *syms, + struct module *owner, + void *data), + void *data) { - unsigned int i, j; + unsigned int j; for (j = 0; j < arrsize; j++) { - for (i = 0; i < arr[j].stop - arr[j].start; i++) - if (fn(&arr[j], owner, i, data)) - return true; + if (fn(&arr[j], owner, data)) + return true; } return false; } /* Returns true as soon as fn returns true, otherwise false. */ -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, - unsigned int symnum, void *data), void *data) +static bool each_symsearch(bool (*fn)(const struct symsearch *syms, + struct module *owner, void *data), + void *data) { struct module *mod; static const struct symsearch arr[] = { @@ -278,7 +278,7 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, #endif }; - if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data)) + if (each_symsearch_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data)) return true; list_for_each_entry_rcu(mod, &modules, list) { @@ -304,11 +304,39 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, #endif }; - if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data)) + if (each_symsearch_in_section(arr, ARRAY_SIZE(arr), mod, fn, + data)) return true; } return false; } + +struct each_symbol_arg { + bool (*fn)(const struct symsearch *arr, struct module *owner, + unsigned int symnum, void *data); + void *data; +}; + +static bool each_symbol_in_symsearch(const struct symsearch *syms, + struct module *owner, void *data) +{ + struct each_symbol_arg *esa = data; + unsigned int i; + + for (i = 0; i < syms->stop - syms->start; i++) { + if (esa->fn(syms, owner, i, esa->data)) + return true; + } + return false; +} + +/* Returns true as soon as fn returns true, otherwise false. */ +bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, + unsigned int symnum, void *data), void *data) +{ + struct each_symbol_arg esa = {fn, data}; + return each_symsearch(each_symbol_in_symsearch, &esa); +} EXPORT_SYMBOL_GPL(each_symbol); struct find_symbol_arg { @@ -323,13 +351,20 @@ struct find_symbol_arg { const struct kernel_symbol *sym; }; -static bool find_symbol_in_section(const struct symsearch *syms, - struct module *owner, - unsigned int symnum, void *data) +static bool find_symbol_in_symsearch(const struct symsearch *syms, + struct module *owner, + void *data) { struct find_symbol_arg *fsa = data; + unsigned int symnum; + int result; - if (strcmp(syms->start[symnum].name, fsa->name) != 0) + for (symnum = 0; symnum < syms->stop - syms->start; symnum++) { + result = strcmp(fsa->name, syms->start[symnum].name); + if (result == 0) + break; + } + if (symnum >= syms->stop - syms->start) return false; if (!fsa->gplok) { @@ -379,7 +414,7 @@ const struct kernel_symbol *find_symbol(const char *name, fsa.gplok = gplok; fsa.warn = warn; - if (each_symbol(find_symbol_in_section, &fsa)) { + if (each_symsearch(find_symbol_in_symsearch, &fsa)) { if (owner) *owner = fsa.owner; if (crc) -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-embedded" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html