Messages in this thread Patch in this message | | | Date | Mon, 11 May 2015 15:32:10 +0900 | From | Namhyung Kim <> | Subject | Re: [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/
| |