From: Wang Nan <wangnan0@huawei.com>
To: <acme@kernel.org>, <ast@plumgrid.com>,
<brendan.d.gregg@gmail.com>, <daniel@iogearbox.net>,
<namhyung@kernel.org>, <masami.hiramatsu.pt@hitachi.com>,
<paulus@samba.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
<jolsa@kernel.org>, <dsahern@gmail.com>
Cc: <linux-kernel@vger.kernel.org>, <lizefan@huawei.com>,
<hekuang@huawei.com>, <xiakaixu@huawei.com>, <pi3orama@163.com>
Subject: [RFC PATCH v8 43/49] perf tools: Iterater over tev instead of pev in bpf__for_each_program
Date: Wed, 24 Jun 2015 12:31:47 +0000 [thread overview]
Message-ID: <1435149113-51142-44-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1435149113-51142-1-git-send-email-wangnan0@huawei.com>
This patch renames bpf__for_each_program() to bpf__for_each_tev() and
makes it iterate over 'struct probe_trace_event' instead of
'struct probe_trace_event' during the loop. The callback (add_bpf_event())
now get rid of the iteration.
This is preparation for further patches, which will allow generating
multiple instances form one BPF program and install then onto different
'struct probe_trace_event'.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
tools/perf/util/bpf-loader.c | 31 +++++++++++++++++++------------
tools/perf/util/bpf-loader.h | 8 ++++----
tools/perf/util/evlist.c | 42 ++++++++++++++++--------------------------
3 files changed, 39 insertions(+), 42 deletions(-)
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index 2936adf..8812e24 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -266,8 +266,7 @@ errout:
}
int
-bpf__for_each_program(bpf_prog_iter_callback_t func,
- void *arg)
+bpf__for_each_tev(bpf_prog_iter_callback_t func, void *arg)
{
struct bpf_object *obj, *tmp;
struct bpf_program *prog;
@@ -275,8 +274,10 @@ bpf__for_each_program(bpf_prog_iter_callback_t func,
bpf_object__for_each(obj, tmp) {
bpf_object__for_each_program(prog, obj) {
+ struct probe_trace_event *tev;
+ struct perf_probe_event *pev;
struct bpf_prog_priv *priv;
- int fd;
+ int i, fd;
err = bpf_program__get_private(prog,
(void **)&priv);
@@ -284,16 +285,22 @@ bpf__for_each_program(bpf_prog_iter_callback_t func,
pr_err("bpf: failed to get private field\n");
return -EINVAL;
}
- err = bpf_program__get_fd(prog, &fd);
- if (err || fd < 0) {
- pr_err("bpf: failed to get file descriptor\n");
- return -EINVAL;
- }
- err = func(priv->pev, fd, arg);
- if (err) {
- pr_err("bpf: call back failed, stop iterate\n");
- return err;
+ pev = priv->pev;
+ for (i = 0; i < pev->ntevs; i++) {
+ tev = &pev->tevs[i];
+
+ err = bpf_program__get_fd(prog, &fd);
+
+ if (err || fd < 0) {
+ pr_err("bpf: failed to get file descriptor\n");
+ return -EINVAL;
+ }
+ err = func(tev, fd, arg);
+ if (err) {
+ pr_err("bpf: call back failed, stop iterate\n");
+ return err;
+ }
}
}
}
diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h
index da03e12..83697e0 100644
--- a/tools/perf/util/bpf-loader.h
+++ b/tools/perf/util/bpf-loader.h
@@ -11,7 +11,7 @@
#define PERF_BPF_PROBE_GROUP "perf_bpf_probe"
-typedef int (*bpf_prog_iter_callback_t)(struct perf_probe_event *pev,
+typedef int (*bpf_prog_iter_callback_t)(struct probe_trace_event *tev,
int fd, void *arg);
#ifdef HAVE_LIBBPF_SUPPORT
@@ -22,7 +22,7 @@ int bpf__load(void);
void bpf__clear(void);
-int bpf__for_each_program(bpf_prog_iter_callback_t func, void *arg);
+int bpf__for_each_tev(bpf_prog_iter_callback_t func, void *arg);
#else
static inline int bpf__prepare_load(const char *filename __maybe_unused,
bool source __maybe_unused)
@@ -37,8 +37,8 @@ static inline int bpf__load(void) { return 0; }
static inline void bpf__clear(void) { }
static inline int
-bpf__for_each_program(bpf_prog_iter_callback_t func __maybe_unused,
- void *arg __maybe_unused)
+bpf__for_each_tev(bpf_prog_iter_callback_t func __maybe_unused,
+ void *arg __maybe_unused)
{
return 0;
}
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 4022bd1..e50aed3 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -195,42 +195,32 @@ error:
return -ENOMEM;
}
-static int add_bpf_event(struct perf_probe_event *pev, int fd,
+static int add_bpf_event(struct probe_trace_event *tev, int fd,
void *arg)
{
struct perf_evlist *evlist = arg;
struct perf_evsel *pos;
struct list_head list;
- int err, idx, entries, i;
-
- if (!pev || !pev->ntevs) {
- pr_err("Internal error: add bpf event before probing\n");
- return -EINVAL;
- }
+ int err, idx, entries;
pr_debug("add bpf event %s:%s and attach bpf program %d\n",
- pev->group, pev->event, fd);
+ tev->group, tev->event, fd);
INIT_LIST_HEAD(&list);
idx = evlist->nr_entries;
- for (i = 0; i < pev->ntevs; i++) {
- struct probe_trace_event *tev = &pev->tevs[i];
-
- pr_debug("adding %s:%s\n", tev->group, tev->event);
- err = parse_events_add_tracepoint(&list, &idx,
- tev->group,
- tev->event);
- if (err) {
- struct perf_evsel *evsel, *tmp;
-
- pr_err("Failed to add BPF event %s:%s\n",
- tev->group, tev->event);
- list_for_each_entry_safe(evsel, tmp, &list, node) {
- list_del(&evsel->node);
- perf_evsel__delete(evsel);
- }
- return -EINVAL;
+ pr_debug("adding %s:%s\n", tev->group, tev->event);
+ err = parse_events_add_tracepoint(&list, &idx, tev->group,
+ tev->event);
+ if (err) {
+ struct perf_evsel *evsel, *tmp;
+
+ pr_err("Failed to add BPF event %s:%s\n",
+ tev->group, tev->event);
+ list_for_each_entry_safe(evsel, tmp, &list, node) {
+ list_del(&evsel->node);
+ perf_evsel__delete(evsel);
}
+ return -EINVAL;
}
list_for_each_entry(pos, &list, node)
@@ -242,7 +232,7 @@ static int add_bpf_event(struct perf_probe_event *pev, int fd,
int perf_evlist__add_bpf(struct perf_evlist *evlist)
{
- return bpf__for_each_program(add_bpf_event, evlist);
+ return bpf__for_each_tev(add_bpf_event, evlist);
}
static int perf_evlist__add_attrs(struct perf_evlist *evlist,
--
1.8.3.4
next prev parent reply other threads:[~2015-06-24 12:34 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 12:31 [RFC PATCH v8 00/49] perf tools: filtering events using eBPF programs Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 01/49] tools build: Add feature check for eBPF API Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 02/49] bpf tools: Introduce 'bpf' library to tools Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 03/49] bpf tools: Allow caller to set printing function Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 04/49] bpf tools: Open eBPF object file and do basic validation Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 05/49] bpf tools: Read eBPF object from buffer Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 06/49] bpf tools: Check endianess and make libbpf fail early Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 07/49] bpf tools: Iterate over ELF sections to collect information Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 08/49] bpf tools: Collect version and license from ELF sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 09/49] bpf tools: Collect map definitions from 'maps' section Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 10/49] bpf tools: Collect symbol table from SHT_SYMTAB section Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 11/49] bpf tools: Collect eBPF programs from their own sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 12/49] bpf tools: Collect relocation sections from SHT_REL sections Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 13/49] bpf tools: Record map accessing instructions for each program Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 14/49] bpf tools: Add bpf.c/h for common bpf operations Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 15/49] bpf tools: Create eBPF maps defined in an object file Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 16/49] bpf tools: Relocate eBPF programs Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 17/49] bpf tools: Introduce bpf_load_program() to bpf.c Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 18/49] bpf tools: Load eBPF programs in object files into kernel Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 19/49] bpf tools: Introduce accessors for struct bpf_program Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 20/49] bpf tools: Introduce accessors for struct bpf_object Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 21/49] bpf tools: Link all bpf objects onto a list Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 22/49] perf tools: Make perf depend on libbpf Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 23/49] perf tools: Introduce llvm config options Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 24/49] perf tools: Call clang to compile C source to object code Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 25/49] perf tests: Add LLVM test for eBPF on-the-fly compiling Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 26/49] perf tools: Auto detecting kernel build directory Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 27/49] perf tools: Auto detecting kernel include options Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 28/49] perf record: Enable passing bpf object file to --event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 29/49] perf record: Compile scriptlets if pass '.c' " Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 30/49] perf tools: Parse probe points of eBPF programs during preparation Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 31/49] perf probe: Attach trace_probe_event with perf_probe_event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 32/49] perf record: Probe at kprobe points Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 33/49] perf record: Load all eBPF object into kernel Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 34/49] perf tools: Add bpf_fd field to evsel and config it Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 35/49] perf tools: Attach eBPF program to perf event Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 36/49] perf tools: Suppress probing messages when probing by BPF loading Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 37/49] perf record: Add clang options for compiling BPF scripts Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 38/49] bpf tools: Load instructions buffer using load_program() Wang Nan
2015-06-26 8:28 ` Alexei Starovoitov
2015-06-26 11:00 ` Wangnan (F)
2015-06-24 12:31 ` [RFC PATCH v8 39/49] bpf tools: Load a program with different instance using preprocessor Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 40/49] perf tools: Fix probe-event.h include Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 41/49] perf probe: Reset tev->args and tev->nargs when failure Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 42/49] perf tools: Move linux/filter.h to tools/include Wang Nan
2015-06-24 12:31 ` Wang Nan [this message]
2015-06-26 8:29 ` [RFC PATCH v8 43/49] perf tools: Iterater over tev instead of pev in bpf__for_each_program Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 44/49] perf tools: Add BPF_PROLOGUE config options for further patches Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 45/49] perf tools: Introduce arch_get_reg_info() for x86 Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 46/49] perf tools: Add prologue for BPF programs for fetching arguments Wang Nan
2015-06-26 4:23 ` Wangnan (F)
2015-06-26 8:32 ` Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 47/49] perf tools: Generate prologue for BPF programs Wang Nan
2015-06-26 8:40 ` Alexei Starovoitov
2015-06-24 12:31 ` [RFC PATCH v8 48/49] perf tools: Use same BPF program if arguments are identical Wang Nan
2015-06-24 12:31 ` [RFC PATCH v8 49/49] perf record: Support custom vmlinux path Wang Nan
2015-06-26 8:37 ` [RFC PATCH v8 00/49] perf tools: filtering events using eBPF programs Alexei Starovoitov
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=1435149113-51142-44-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=hekuang@huawei.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 \
--cc=xiakaixu@huawei.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®