module: Use the binary search for symbols resolution
Alessio Igor Bogani [Wed, 20 Apr 2011 09:10:52 +0000 (11:10 +0200)]
Takes advantage of the order and locates symbols using binary search.

This work was supported by a hardware donation from the CE Linux Forum.

Signed-off-by: Alessio Igor Bogani <abogani@kernel.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Tested-by: Dirk Behme <dirk.behme@googlemail.com>

kernel/module.c

index e8aa462..d1db8eb 100644 (file)
@@ -57,6 +57,7 @@
 #include <linux/kmemleak.h>
 #include <linux/jump_label.h>
 #include <linux/pfn.h>
+#include <linux/bsearch.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/module.h>
@@ -363,17 +364,27 @@ static bool check_symbol(const struct symsearch *syms,
        return true;
 }
 
+static int cmp_name(const void *va, const void *vb)
+{
+       const char *a;
+       const struct kernel_symbol *b;
+       a = va; b = vb;
+       return strcmp(a, b->name);
+}
+
 static bool find_symbol_in_section(const struct symsearch *syms,
                                   struct module *owner,
                                   void *data)
 {
        struct find_symbol_arg *fsa = data;
-       unsigned int i;
+       struct kernel_symbol *sym;
+
+       sym = bsearch(fsa->name, syms->start, syms->stop - syms->start,
+                       sizeof(struct kernel_symbol), cmp_name);
+
+       if (sym != NULL && check_symbol(syms, owner, sym - syms->start, data))
+               return true;
 
-       for (i = 0; i < syms->stop - syms->start; i++) {
-               if (strcmp(syms->start[i].name, fsa->name) == 0)
-                       return check_symbol(syms, owner, i, data);
-       }
        return false;
 }