Skip to content

Commit

Permalink
module: Use the binary search for symbols resolution
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Rusty Russell <[email protected]>
Tested-by: Dirk Behme <[email protected]>
  • Loading branch information
abogani authored and rustyrussell committed May 19, 2011
1 parent 1a94dc3 commit 403ed27
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 403ed27

Please sign in to comment.