lkml.org 
[lkml]   [2016]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next 5/9] samples/bpf: move ksym_search() into library
    Date
    move ksym search from offwaketime into library to be reused
    in other tests

    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    ---
    samples/bpf/bpf_load.c | 62 ++++++++++++++++++++++++++++++++++++++
    samples/bpf/bpf_load.h | 6 ++++
    samples/bpf/offwaketime_user.c | 67 +-----------------------------------------
    3 files changed, 69 insertions(+), 66 deletions(-)

    diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c
    index 816bca5760a0..d16864293c00 100644
    --- a/samples/bpf/bpf_load.c
    +++ b/samples/bpf/bpf_load.c
    @@ -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];
    +}
    diff --git a/samples/bpf/bpf_load.h b/samples/bpf/bpf_load.h
    index cbd7c2b532b9..dfa57fe65c8e 100644
    --- a/samples/bpf/bpf_load.h
    +++ b/samples/bpf/bpf_load.h
    @@ -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
    diff --git a/samples/bpf/offwaketime_user.c b/samples/bpf/offwaketime_user.c
    index 17cf3024e22c..6f002a9c24fa 100644
    --- a/samples/bpf/offwaketime_user.c
    +++ b/samples/bpf/offwaketime_user.c
    @@ -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
    --
    2.6.5
    \
     
     \ /
      Last update: 2016-03-07 03:41    [W:4.577 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site