lkml.org 
[lkml]   [2015]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [RFC PATCH 09/22] perf bpf: collect map definitions.
    On Thu, Apr 30, 2015 at 10:52:32AM +0000, Wang Nan wrote:
    > 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);

    Doesn't it need to swap the data as it's binary?

    Thanks,
    Namhyung


    > + 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
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html
    > Please read the FAQ at http://www.tux.org/lkml/


    \
     
     \ /
      Last update: 2015-05-11 09:21    [W:3.893 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site