Skip to content

Commit

Permalink
samples/bpf: move ksym_search() into library
Browse files Browse the repository at this point in the history
move ksym search from offwaketime into library to be reused
in other tests

Signed-off-by: Alexei Starovoitov <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
4ast authored and davem330 committed Mar 8, 2016
1 parent 618ec9a commit 3622e7e
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 66 deletions.
62 changes: 62 additions & 0 deletions samples/bpf/bpf_load.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,3 +346,65 @@ void read_trace_pipe(void)
}
}
}

#define MAX_SYMS 300000
static struct ksym syms[MAX_SYMS];
static int sym_cnt;

static int ksym_cmp(const void *p1, const void *p2)
{
return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr;
}

int load_kallsyms(void)
{
FILE *f = fopen("/proc/kallsyms", "r");
char func[256], buf[256];
char symbol;
void *addr;
int i = 0;

if (!f)
return -ENOENT;

while (!feof(f)) {
if (!fgets(buf, sizeof(buf), f))
break;
if (sscanf(buf, "%p %c %s", &addr, &symbol, func) != 3)
break;
if (!addr)
continue;
syms[i].addr = (long) addr;
syms[i].name = strdup(func);
i++;
}
sym_cnt = i;
qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp);
return 0;
}

struct ksym *ksym_search(long key)
{
int start = 0, end = sym_cnt;
int result;

while (start < end) {
size_t mid = start + (end - start) / 2;

result = key - syms[mid].addr;
if (result < 0)
end = mid;
else if (result > 0)
start = mid + 1;
else
return &syms[mid];
}

if (start >= 1 && syms[start - 1].addr < key &&
key < syms[start].addr)
/* valid ksym */
return &syms[start - 1];

/* out of range. return _stext */
return &syms[0];
}
6 changes: 6 additions & 0 deletions samples/bpf/bpf_load.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,11 @@ extern int event_fd[MAX_PROGS];
int load_bpf_file(char *path);

void read_trace_pipe(void);
struct ksym {
long addr;
char *name;
};

int load_kallsyms(void);
struct ksym *ksym_search(long key);
#endif
67 changes: 1 addition & 66 deletions samples/bpf/offwaketime_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,80 +18,15 @@
#include "libbpf.h"
#include "bpf_load.h"

#define MAX_SYMS 300000
#define PRINT_RAW_ADDR 0

static struct ksym {
long addr;
char *name;
} syms[MAX_SYMS];
static int sym_cnt;

static int ksym_cmp(const void *p1, const void *p2)
{
return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr;
}

static int load_kallsyms(void)
{
FILE *f = fopen("/proc/kallsyms", "r");
char func[256], buf[256];
char symbol;
void *addr;
int i = 0;

if (!f)
return -ENOENT;

while (!feof(f)) {
if (!fgets(buf, sizeof(buf), f))
break;
if (sscanf(buf, "%p %c %s", &addr, &symbol, func) != 3)
break;
if (!addr)
continue;
syms[i].addr = (long) addr;
syms[i].name = strdup(func);
i++;
}
sym_cnt = i;
qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp);
return 0;
}

static void *search(long key)
{
int start = 0, end = sym_cnt;
int result;

while (start < end) {
size_t mid = start + (end - start) / 2;

result = key - syms[mid].addr;
if (result < 0)
end = mid;
else if (result > 0)
start = mid + 1;
else
return &syms[mid];
}

if (start >= 1 && syms[start - 1].addr < key &&
key < syms[start].addr)
/* valid ksym */
return &syms[start - 1];

/* out of range. return _stext */
return &syms[0];
}

static void print_ksym(__u64 addr)
{
struct ksym *sym;

if (!addr)
return;
sym = search(addr);
sym = ksym_search(addr);
if (PRINT_RAW_ADDR)
printf("%s/%llx;", sym->name, addr);
else
Expand Down

0 comments on commit 3622e7e

Please sign in to comment.