lkml.org 
[lkml]   [2015]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 09/22] perf bpf: collect map definitions.
    Date
    If maps are used by eBPF programs, corresponding object file(s) should
    contain a section named 'map'. Which contains map definitions, one for
    each map to describe its format. 'struct perf_bpf_map_def' is
    introduced as part of protocol between perf and eBPF programs. All map
    definitions are copied to obj->maps.

    bpf.h is introduced for common bpf operations.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    ---
    tools/perf/util/bpf-loader.c | 31 +++++++++++++++++++++++++++++++
    tools/perf/util/bpf-loader.h | 3 +++
    2 files changed, 34 insertions(+)

    diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
    index 296fb06..bf3b793 100644
    --- a/tools/perf/util/bpf-loader.c
    +++ b/tools/perf/util/bpf-loader.c
    @@ -65,6 +65,8 @@ static void bpf_obj_close(struct bpf_obj *obj)

    if (obj->path)
    free(obj->path);
    + if (obj->maps)
    + free(obj->maps);
    free(obj);
    }

    @@ -183,6 +185,32 @@ static int bpf_obj_kver_init(struct bpf_obj *obj,
    return 0;
    }

    +static int bpf_obj_maps_init(struct bpf_obj *obj, void *data,
    + size_t size)
    +{
    + size_t map_def_sz = sizeof(struct bpf_map_def);
    + int nr_maps = size / map_def_sz;
    +
    + if (nr_maps == 0) {
    + pr_debug("bpf: %s doesn't need map definition\n",
    + obj->path);
    + return 0;
    + }
    +
    + obj->maps = malloc(nr_maps * map_def_sz);
    + if (!obj->maps) {
    + pr_err("bpf: malloc maps failed: %s\n", obj->path);
    + return -ENOMEM;
    + }
    +
    + obj->nr_maps = nr_maps;
    + memcpy(obj->maps, data, nr_maps * map_def_sz);
    + pr_debug("bpf: %d map%s in %s\n", nr_maps,
    + nr_maps > 1 ? "s" : "",
    + obj->path);
    + return 0;
    +}
    +
    static int bpf_obj_elf_collect(struct bpf_obj *obj)
    {
    Elf *elf = obj->elf.elf;
    @@ -237,6 +265,9 @@ static int bpf_obj_elf_collect(struct bpf_obj *obj)
    else if (strcmp(name, "version") == 0)
    err = bpf_obj_kver_init(obj, data->d_buf,
    data->d_size);
    + else if (strcmp(name, "maps") == 0)
    + err = bpf_obj_maps_init(obj, data->d_buf,
    + data->d_size);
    if (err)
    goto out;
    }
    diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h
    index e1d5c42..6c5c8d6 100644
    --- a/tools/perf/util/bpf-loader.h
    +++ b/tools/perf/util/bpf-loader.h
    @@ -14,6 +14,7 @@
    #include "perf.h"
    #include "symbol.h"
    #include "probe-event.h"
    +#include "bpf.h"

    int bpf__load(const char *path);
    int bpf__run(void);
    @@ -25,6 +26,8 @@ struct bpf_obj {
    bool needs_swap;
    char license[64];
    u32 kern_version;
    + struct bpf_map_def *maps;
    + size_t nr_maps;

    /*
    * Information when doing elf related work. Only valid if fd
    --
    1.8.3.4


    \
     
     \ /
      Last update: 2015-04-30 13:21    [W:4.150 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site