mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Wang Nan <wangnan0@huawei.com>
To: <paulus@samba.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
	<acme@kernel.org>, <namhyung@kernel.org>, <jolsa@kernel.org>,
	<dsahern@gmail.com>, <ast@plumgrid.com>, <daniel@iogearbox.net>,
	<brendan.d.gregg@gmail.com>, <masami.hiramatsu.pt@hitachi.com>
Cc: <lizefan@huawei.com>, <linux-kernel@vger.kernel.org>, <pi3orama@163.com>
Subject: [RFC PATCH v3 21/37] bpf tools: Create eBPF maps defined in an object file
Date: Sun, 17 May 2015 10:56:46 +0000	[thread overview]
Message-ID: <1431860222-61636-22-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1431860222-61636-1-git-send-email-wangnan0@huawei.com>

This patch creates maps based on 'map' section in object file using
bpf_create_map(), and store the fds into an array in
'struct bpf_object'. Since the byte order of the object may differ
from the host, swap map definition before processing.

This is the first patch in 'loading' phase. Previous patches parse ELF
object file and create needed data structure, but doesnnt play with
kernel. They belong to 'opening' phase.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
 tools/lib/bpf/libbpf.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/lib/bpf/libbpf.h |  4 +++
 2 files changed, 102 insertions(+)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 9ed8cca..6ff4cb6 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -22,6 +22,7 @@
 #include <gelf.h>
 
 #include "libbpf.h"
+#include "bpf.h"
 
 #ifdef min
 # undef min
@@ -107,6 +108,7 @@ struct bpf_object {
 
 	struct bpf_program *programs;
 	size_t nr_programs;
+	int *maps_fds;
 
 	/*
 	 * Information when doing elf related work. Only valid if fd
@@ -613,6 +615,67 @@ bpf_program_collect_reloc(struct bpf_object *obj,
 	return 0;
 }
 
+static int
+bpf_obj_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->maps_fds = malloc(sizeof(int) * nr_maps);
+	if (!obj->maps_fds) {
+		pr_warning("realloc perf_bpf_maps_fds failed\n");
+		return -ENOMEM;
+	}
+
+	/* fill all fd with -1 */
+	memset(obj->maps_fds, 0xff, sizeof(int) * nr_maps);
+	
+	pfd = obj->maps_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));
+
+		if (obj->needs_swap) {
+			def.type	= bswap_32(def.type);
+			def.key_size	= bswap_32(def.key_size);
+			def.value_size	= bswap_32(def.value_size);
+			def.max_entries	= bswap_32(def.max_entries);
+		}
+
+		*pfd = bpf_create_map(def.type,
+				      def.key_size,
+				      def.value_size,
+				      def.max_entries);
+		if (*pfd < 0) {
+			size_t j;
+			int err = *pfd;
+
+			pr_warning("failed to create map: %s\n",
+				   strerror(errno));
+			for (j = 0; j < i; j++) {
+				close(obj->maps_fds[j]);
+				obj->maps_fds[j] = -1;
+			}
+			free(obj->maps_fds);
+			obj->maps_fds = NULL;
+			return err;
+		}
+		pr_debug("create map: fd=%d\n", *pfd);
+		pfd ++;
+	}
+	return 0;
+}
+
 static int bpf_obj_collect_reloc(struct bpf_object *obj)
 {
 	int i, err;
@@ -694,12 +757,47 @@ out:
 	return NULL;
 }
 
+int bpf_unload_object(struct bpf_object *obj)
+{
+	if (!obj)
+		return -EINVAL;
+
+	if (obj->maps_fds) {
+		size_t i;
+		size_t sz = sizeof(struct bpf_map_def);
+
+		for (i = 0; i < obj->maps_buf_sz; i += sz) {
+			if (obj->maps_fds[i] >= 0)
+				close(obj->maps_fds[i]);
+		}
+		free(obj->maps_fds);
+	}
+
+	return 0;
+}
+
+int bpf_load_object(struct bpf_object *obj)
+{
+	if (!obj)
+		return -EINVAL;
+
+	if (bpf_obj_create_maps(obj))
+		goto out;
+
+	return 0;
+out:
+	bpf_unload_object(obj);
+	pr_warning("failed to load object '%s'\n", obj->path);
+	return -EINVAL;
+}
+
 void bpf_close_object(struct bpf_object *obj)
 {
 	if (!obj)
 		return;
 
 	bpf_obj_clear_elf(obj);
+	bpf_unload_object(obj);
 
 	if (obj->path)
 		free(obj->path);
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index 3505be7..c0b290d 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -21,6 +21,10 @@ struct bpf_object;
 struct bpf_object *bpf_open_object(const char *path);
 void bpf_close_object(struct bpf_object *object);
 
+/* Load/unload object into/from kernel */
+int bpf_load_object(struct bpf_object *obj);
+int bpf_unload_object(struct bpf_object *obj);
+
 /*
  * packed attribute is unnecessary for 'bpf_map_def'.
  */
-- 
1.8.3.4


  parent reply	other threads:[~2015-05-17 11:03 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-17 10:56 [RFC PATCH v3 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 01/37] perf/events/core: fix race in bpf program unregister Wang Nan
2015-05-18 16:59   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 02/37] perf tools: Set vmlinux_path__nr_entries to 0 in vmlinux_path__exit Wang Nan
2015-05-18 17:01   ` Alexei Starovoitov
2015-05-18 20:28     ` Arnaldo Carvalho de Melo
2015-05-20 12:25   ` [tip:perf/core] " tip-bot for Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 03/37] tools lib traceevent: Install libtraceevent.a into libdir Wang Nan
2015-05-18 14:28   ` Jiri Olsa
2015-05-20 12:26   ` [tip:perf/core] " tip-bot for Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 04/37] tools: Change FEATURE_TESTS and FEATURE_DISPLAY to weak binding Wang Nan
2015-05-18 14:30   ` Jiri Olsa
2015-05-20 12:26   ` [tip:perf/core] tools build: " tip-bot for Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 05/37] tools: Add __aligned_u64 to types.h Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 06/37] bpf tools: Introduce 'bpf' library to tools Wang Nan
2015-05-18 17:35   ` Alexei Starovoitov
2015-05-20  3:48     ` Wangnan (F)
2015-05-20  5:24       ` Alexei Starovoitov
2015-05-21  0:24         ` Wangnan (F)
2015-05-21 17:53           ` Alexei Starovoitov
2015-05-21  7:10     ` Wangnan (F)
2015-05-17 10:56 ` [RFC PATCH v3 07/37] bpf tools: Allow caller to set printing function Wang Nan
2015-05-18 17:55   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 08/37] bpf tools: Define basic interface Wang Nan
2015-05-18 17:57   ` Alexei Starovoitov
2015-05-22 17:22     ` Jiri Olsa
2015-05-17 10:56 ` [RFC PATCH v3 09/37] bpf tools: Open eBPF object file and do basic validation Wang Nan
2015-05-18 18:06   ` Alexei Starovoitov
2015-05-22 17:22   ` Jiri Olsa
2015-05-22 17:23   ` Jiri Olsa
2015-05-23  1:00     ` Alexei Starovoitov
2015-05-25 13:30       ` Arnaldo Carvalho de Melo
2015-05-26  0:05         ` Wangnan (F)
2015-05-26  0:41           ` Arnaldo Carvalho de Melo
2015-05-17 10:56 ` [RFC PATCH v3 10/37] bpf tools: Check endianess and set swap flag according to EHDR Wang Nan
2015-05-18 18:19   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 11/37] bpf tools: Iterate over ELF sections to collect information Wang Nan
2015-05-18 18:21   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 12/37] bpf tools: Collect version and license from ELF sections Wang Nan
2015-05-18 18:27   ` Alexei Starovoitov
2015-05-18 20:34     ` Arnaldo Carvalho de Melo
2015-05-18 20:51       ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 13/37] bpf tools: Collect map definitions from 'maps' section Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 14/37] bpf tools: Collect config string from 'config' section Wang Nan
2015-05-18 18:30   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 15/37] bpf tools: Collect symbol table from SHT_SYMTAB section Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 16/37] bpf tools: Collect eBPF programs from their own sections Wang Nan
2015-05-18 12:29   ` Namhyung Kim
2015-05-18 12:47     ` Wangnan (F)
2015-05-18 18:32       ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 17/37] bpf tools: Collect relocation sections from SHT_REL sections Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 18/37] bpf tools: Record map accessing instructions for each program Wang Nan
2015-05-18 18:34   ` Alexei Starovoitov
2015-05-25  7:39     ` Wangnan (F)
2015-05-17 10:56 ` [RFC PATCH v3 19/37] bpf tools: Clear libelf and ELF parsing resrouce to finish opening Wang Nan
2015-05-18 18:36   ` Alexei Starovoitov
2015-05-18 20:35     ` Arnaldo Carvalho de Melo
2015-05-17 10:56 ` [RFC PATCH v3 20/37] bpf tools: Add bpf.c/h for common bpf operations Wang Nan
2015-05-18 18:39   ` Alexei Starovoitov
2015-05-22 17:24   ` Jiri Olsa
2015-05-17 10:56 ` Wang Nan [this message]
2015-05-18 18:48   ` [RFC PATCH v3 21/37] bpf tools: Create eBPF maps defined in an object file Alexei Starovoitov
2015-05-18 20:37     ` Arnaldo Carvalho de Melo
2015-05-25  9:23     ` Wangnan (F)
2015-05-22 17:23   ` Jiri Olsa
2015-05-17 10:56 ` [RFC PATCH v3 22/37] bpf tools: Relocate eBPF programs Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 23/37] bpf tools: Introduce bpf_load_program() to bpf.c Wang Nan
2015-05-18 18:52   ` Alexei Starovoitov
2015-05-18 20:37     ` Arnaldo Carvalho de Melo
2015-05-17 10:56 ` [RFC PATCH v3 24/37] bpf tools: Load eBPF programs in object files into kernel Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 25/37] bpf tools: Introduce accessors for struct bpf_program Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 26/37] bpf tools: Introduce accessors for struct bpf_object Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 27/37] perf tools: Add new 'perf bpf' command Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 28/37] perf tools: Make perf depend on libbpf Wang Nan
2015-05-22 17:24   ` Jiri Olsa
2015-05-17 10:56 ` [RFC PATCH v3 29/37] perf bpf: Add 'perf bpf record' subcommand Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 30/37] perf bpf: Add bpf-loader and open ELF object files Wang Nan
2015-05-22 17:24   ` Jiri Olsa
2015-05-25 11:47     ` Wangnan (F)
2015-05-25 13:00     ` Arnaldo Carvalho de Melo
2015-05-17 10:56 ` [RFC PATCH v3 31/37] perf bpf: Collect all eBPF programs Wang Nan
2015-05-17 10:56 ` [RFC PATCH v3 32/37] perf bpf: Parse probe points of eBPF programs during preparation Wang Nan
2015-05-22 17:24   ` Jiri Olsa
2015-05-17 10:56 ` [RFC PATCH v3 33/37] perf bpf: Probe at kprobe points Wang Nan
2015-05-18 19:25   ` Alexei Starovoitov
2015-05-17 10:56 ` [RFC PATCH v3 34/37] perf bpf: Load all eBPF object into kernel Wang Nan
2015-05-17 10:57 ` [RFC PATCH v3 35/37] perf tools: Add a bpf_wrapper global flag Wang Nan
2015-05-17 10:57 ` [RFC PATCH v3 36/37] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-05-17 10:57 ` [RFC PATCH v3 37/37] perf tools: Attach eBPF program to perf event Wang Nan
2015-05-18 19:38 ` [RFC PATCH v3 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Alexei Starovoitov
2015-05-18 20:44   ` Arnaldo Carvalho de Melo
2015-05-18 21:05     ` Alexei Starovoitov
2015-05-18 21:20       ` Arnaldo Carvalho de Melo
2015-05-18 21:45         ` Alexei Starovoitov
2015-05-19 13:44           ` Arnaldo Carvalho de Melo
2015-05-19 16:04             ` Namhyung Kim
2015-05-19 16:40               ` Arnaldo Carvalho de Melo
2015-05-19 20:46                 ` Alexei Starovoitov
2015-05-19 21:10                   ` Arnaldo Carvalho de Melo
2015-05-19 21:42                     ` Alexei Starovoitov
2015-05-19 22:05                       ` Arnaldo Carvalho de Melo
2015-05-20  1:02                         ` Alexei Starovoitov
2015-05-20  1:14                           ` Arnaldo Carvalho de Melo
2015-05-20  0:30                     ` Namhyung Kim
2015-05-20  0:43                       ` Arnaldo Carvalho de Melo
2015-05-26  6:22                   ` Wangnan (F)
2015-05-20  0:23                 ` Namhyung Kim
2015-05-20  0:37                   ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1431860222-61636-22-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=ast@plumgrid.com \
    --cc=brendan.d.gregg@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=dsahern@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    --cc=pi3orama@163.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®