[tip:perf/core] tools lib bpf: Collect map definition in bpf_object

2015-11-28 Thread tip-bot for Wang Nan
Commit-ID:  9d759a9b4ac2690077d8b21258e6e95c3e34bfa9
Gitweb: http://git.kernel.org/tip/9d759a9b4ac2690077d8b21258e6e95c3e34bfa9
Author: Wang Nan 
AuthorDate: Fri, 27 Nov 2015 08:47:35 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Fri, 27 Nov 2015 21:57:09 -0300

tools lib bpf: Collect map definition in bpf_object

This patch collects more information from maps sections in BPF object
files into 'struct bpf_object', enables later patches access those
information (such as the type and size of the map).

In this patch, a new handler 'struct bpf_map' is extracted in parallel
with bpf_object and bpf_program. Its iterator and accessor is also
created.

Signed-off-by: Wang Nan 
Cc: Alexei Starovoitov 
Cc: Masami Hiramatsu 
Cc: Namhyung Kim 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1448614067-197576-2-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/lib/bpf/libbpf.c | 187 +
 tools/lib/bpf/libbpf.h |  21 ++
 2 files changed, 148 insertions(+), 60 deletions(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index e3f4c33..f509825 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -163,22 +163,24 @@ struct bpf_program {
bpf_program_clear_priv_t clear_priv;
 };
 
+struct bpf_map {
+   int fd;
+   struct bpf_map_def def;
+   void *priv;
+   bpf_map_clear_priv_t clear_priv;
+};
+
 static LIST_HEAD(bpf_objects_list);
 
 struct bpf_object {
char license[64];
u32 kern_version;
-   void *maps_buf;
-   size_t maps_buf_sz;
 
struct bpf_program *programs;
size_t nr_programs;
-   int *map_fds;
-   /*
-* This field is required because maps_buf will be freed and
-* maps_buf_sz will be set to 0 after loaded.
-*/
-   size_t nr_map_fds;
+   struct bpf_map *maps;
+   size_t nr_maps;
+
bool loaded;
 
/*
@@ -489,21 +491,38 @@ static int
 bpf_object__init_maps(struct bpf_object *obj, void *data,
  size_t size)
 {
-   if (size == 0) {
+   size_t nr_maps;
+   int i;
+
+   nr_maps = size / sizeof(struct bpf_map_def);
+   if (!data || !nr_maps) {
pr_debug("%s doesn't need map definition\n",
 obj->path);
return 0;
}
 
-   obj->maps_buf = malloc(size);
-   if (!obj->maps_buf) {
-   pr_warning("malloc maps failed: %s\n", obj->path);
+   pr_debug("maps in %s: %zd bytes\n", obj->path, size);
+
+   obj->maps = calloc(nr_maps, sizeof(obj->maps[0]));
+   if (!obj->maps) {
+   pr_warning("alloc maps for object failed\n");
return -ENOMEM;
}
+   obj->nr_maps = nr_maps;
+
+   for (i = 0; i < nr_maps; i++) {
+   struct bpf_map_def *def = >maps[i].def;
 
-   obj->maps_buf_sz = size;
-   memcpy(obj->maps_buf, data, size);
-   pr_debug("maps in %s: %ld bytes\n", obj->path, (long)size);
+   /*
+* fill all fd with -1 so won't close incorrect
+* fd (fd=0 is stdin) when failure (zclose won't close
+* negative fd)).
+*/
+   obj->maps[i].fd = -1;
+
+   /* Save map definition into obj->maps */
+   *def = ((struct bpf_map_def *)data)[i];
+   }
return 0;
 }
 
@@ -688,37 +707,15 @@ static int
 bpf_object__create_maps(struct bpf_object *obj)
 {
unsigned int i;
-   size_t nr_maps;
-   int *pfd;
-
-   nr_maps = obj->maps_buf_sz / sizeof(struct bpf_map_def);
-   if (!obj->maps_buf || !nr_maps) {
-   pr_debug("don't need create maps for %s\n",
-obj->path);
-   return 0;
-   }
 
-   obj->map_fds = malloc(sizeof(int) * nr_maps);
-   if (!obj->map_fds) {
-   pr_warning("realloc perf_bpf_map_fds failed\n");
-   return -ENOMEM;
-   }
-   obj->nr_map_fds = nr_maps;
-
-   /* fill all fd with -1 */
-   memset(obj->map_fds, -1, sizeof(int) * nr_maps);
+   for (i = 0; i < obj->nr_maps; i++) {
+   struct bpf_map_def *def = >maps[i].def;
+   int *pfd = >maps[i].fd;
 
-   pfd = obj->map_fds;
-   for (i = 0; i < nr_maps; i++) {
-   struct bpf_map_def def;
-
-   def = *(struct bpf_map_def *)(obj->maps_buf +
-   i * sizeof(struct bpf_map_def));
-
-   *pfd = bpf_create_map(def.type,
- def.key_size,
- def.value_size,
- def.max_entries);
+   *pfd = bpf_create_map(def->type,
+ def->key_size,
+ def->value_size,
+ def->max_entries);

[tip:perf/core] tools lib bpf: Collect map definition in bpf_object

2015-11-28 Thread tip-bot for Wang Nan
Commit-ID:  9d759a9b4ac2690077d8b21258e6e95c3e34bfa9
Gitweb: http://git.kernel.org/tip/9d759a9b4ac2690077d8b21258e6e95c3e34bfa9
Author: Wang Nan 
AuthorDate: Fri, 27 Nov 2015 08:47:35 +
Committer:  Arnaldo Carvalho de Melo 
CommitDate: Fri, 27 Nov 2015 21:57:09 -0300

tools lib bpf: Collect map definition in bpf_object

This patch collects more information from maps sections in BPF object
files into 'struct bpf_object', enables later patches access those
information (such as the type and size of the map).

In this patch, a new handler 'struct bpf_map' is extracted in parallel
with bpf_object and bpf_program. Its iterator and accessor is also
created.

Signed-off-by: Wang Nan 
Cc: Alexei Starovoitov 
Cc: Masami Hiramatsu 
Cc: Namhyung Kim 
Cc: Zefan Li 
Cc: pi3or...@163.com
Link: 
http://lkml.kernel.org/r/1448614067-197576-2-git-send-email-wangn...@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo 
---
 tools/lib/bpf/libbpf.c | 187 +
 tools/lib/bpf/libbpf.h |  21 ++
 2 files changed, 148 insertions(+), 60 deletions(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index e3f4c33..f509825 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -163,22 +163,24 @@ struct bpf_program {
bpf_program_clear_priv_t clear_priv;
 };
 
+struct bpf_map {
+   int fd;
+   struct bpf_map_def def;
+   void *priv;
+   bpf_map_clear_priv_t clear_priv;
+};
+
 static LIST_HEAD(bpf_objects_list);
 
 struct bpf_object {
char license[64];
u32 kern_version;
-   void *maps_buf;
-   size_t maps_buf_sz;
 
struct bpf_program *programs;
size_t nr_programs;
-   int *map_fds;
-   /*
-* This field is required because maps_buf will be freed and
-* maps_buf_sz will be set to 0 after loaded.
-*/
-   size_t nr_map_fds;
+   struct bpf_map *maps;
+   size_t nr_maps;
+
bool loaded;
 
/*
@@ -489,21 +491,38 @@ static int
 bpf_object__init_maps(struct bpf_object *obj, void *data,
  size_t size)
 {
-   if (size == 0) {
+   size_t nr_maps;
+   int i;
+
+   nr_maps = size / sizeof(struct bpf_map_def);
+   if (!data || !nr_maps) {
pr_debug("%s doesn't need map definition\n",
 obj->path);
return 0;
}
 
-   obj->maps_buf = malloc(size);
-   if (!obj->maps_buf) {
-   pr_warning("malloc maps failed: %s\n", obj->path);
+   pr_debug("maps in %s: %zd bytes\n", obj->path, size);
+
+   obj->maps = calloc(nr_maps, sizeof(obj->maps[0]));
+   if (!obj->maps) {
+   pr_warning("alloc maps for object failed\n");
return -ENOMEM;
}
+   obj->nr_maps = nr_maps;
+
+   for (i = 0; i < nr_maps; i++) {
+   struct bpf_map_def *def = >maps[i].def;
 
-   obj->maps_buf_sz = size;
-   memcpy(obj->maps_buf, data, size);
-   pr_debug("maps in %s: %ld bytes\n", obj->path, (long)size);
+   /*
+* fill all fd with -1 so won't close incorrect
+* fd (fd=0 is stdin) when failure (zclose won't close
+* negative fd)).
+*/
+   obj->maps[i].fd = -1;
+
+   /* Save map definition into obj->maps */
+   *def = ((struct bpf_map_def *)data)[i];
+   }
return 0;
 }
 
@@ -688,37 +707,15 @@ static int
 bpf_object__create_maps(struct bpf_object *obj)
 {
unsigned int i;
-   size_t nr_maps;
-   int *pfd;
-
-   nr_maps = obj->maps_buf_sz / sizeof(struct bpf_map_def);
-   if (!obj->maps_buf || !nr_maps) {
-   pr_debug("don't need create maps for %s\n",
-obj->path);
-   return 0;
-   }
 
-   obj->map_fds = malloc(sizeof(int) * nr_maps);
-   if (!obj->map_fds) {
-   pr_warning("realloc perf_bpf_map_fds failed\n");
-   return -ENOMEM;
-   }
-   obj->nr_map_fds = nr_maps;
-
-   /* fill all fd with -1 */
-   memset(obj->map_fds, -1, sizeof(int) * nr_maps);
+   for (i = 0; i < obj->nr_maps; i++) {
+   struct bpf_map_def *def = >maps[i].def;
+   int *pfd = >maps[i].fd;
 
-   pfd = obj->map_fds;
-   for (i = 0; i < nr_maps; i++) {
-   struct bpf_map_def def;
-
-   def = *(struct bpf_map_def *)(obj->maps_buf +
-   i * sizeof(struct bpf_map_def));
-
-   *pfd = bpf_create_map(def.type,
- def.key_size,
- def.value_size,
- def.max_entries);
+   *pfd = bpf_create_map(def->type,
+