Signed-off-by: Tim Abbott <tabbott@xxxxxxxxxxx> --- kernel/module.c | 34 +++++++++++++++------------------- 1 files changed, 15 insertions(+), 19 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index 9b19f23..25ff16b 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -55,6 +55,7 @@ #include <linux/async.h> #include <linux/percpu.h> #include <linux/kmemleak.h> +#include <linux/bsearch.h> #define CREATE_TRACE_POINTS #include <trace/events/module.h> @@ -209,31 +210,26 @@ struct symsearch { #define symversion(base, idx) ((base != NULL) ? ((base) + (idx)) : NULL) #endif -/* binary search on sorted symbols */ +static int symbol_compare(const void *key, const void *elt) +{ + const char *str = key; + const struct kernel_symbol *sym = elt; + return strcmp(sym->name, str); +} + static bool find_symbol_in_kernel_section(const struct symsearch *syms, const char *name, unsigned int *symnum) { - int lo = 0, hi = syms->stop - syms->start - 1; - int mid, cmp; - - while (lo <= hi) { - mid = (lo + hi) / 2; - cmp = strcmp(syms->start[mid].name, name); - if (cmp == 0) { - *symnum = mid; - return true; - } - else if (cmp < 0) - hi = mid - 1; - else - lo = mid + 1; - } - - return false; + const struct kernel_symbol *sym = + bsearch(name, syms->start, syms->stop - syms->start, + sizeof(*syms->start), symbol_compare); + if (sym == NULL) + return false; + *symnum = sym - syms->start; + return true; } - static bool find_symbol_in_kernel(const char *name, struct symsearch *sym, unsigned int *symnum) -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-modules" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html