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 32/49] perf record: Probe at kprobe points
Date: Wed, 24 Jun 2015 12:31:36 +0000 [thread overview]
Message-ID: <1435149113-51142-33-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1435149113-51142-1-git-send-email-wangnan0@huawei.com>
In this patch, kprobe points are created using add_perf_probe_events.
Since all events are already grouped together in an array, calling
add_perf_probe_events() once creates all of them.
probe_conf.max_probes is set to MAX_PROBES to support glob matching.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
tools/perf/builtin-record.c | 18 ++++++++++++++++-
tools/perf/util/bpf-loader.c | 48 ++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/bpf-loader.h | 4 ++++
3 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index de165a1..28ceae8 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -29,6 +29,7 @@
#include "util/data.h"
#include "util/auxtrace.h"
#include "util/parse-branch-options.h"
+#include "util/bpf-loader.h"
#include <unistd.h>
#include <sched.h>
@@ -1109,7 +1110,21 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
if (err)
return err;
- err = -ENOMEM;
+ /*
+ * bpf__probe must be called before symbol__init() because we
+ * need init_symbol_maps. If called after symbol__init,
+ * symbol_conf.sort_by_name won't take effect.
+ *
+ * bpf__unprobe() is safe even if bpf__probe() failed, and it
+ * also calls symbol__init. Therefore, goto out_symbol_exit
+ * is safe when probe failed.
+ */
+ err = bpf__probe();
+ if (err) {
+ pr_err("Probing at events in BPF object failed.\n");
+ pr_err("Try perf probe -d '*' to remove existing probe events.\n");
+ goto out_symbol_exit;
+ }
symbol__init(NULL);
@@ -1170,6 +1185,7 @@ out_symbol_exit:
perf_evlist__delete(rec->evlist);
symbol__exit();
auxtrace_record__free(rec->itr);
+ bpf__unprobe();
return err;
}
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index a202702..cb11561 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -191,3 +191,51 @@ void bpf__clear(void)
bpf_object__for_each(obj, tmp)
bpf_object__close(obj);
}
+
+static bool is_probing = false;
+
+int bpf__unprobe(void)
+{
+ struct strfilter *delfilter;
+ int ret;
+
+ if (!is_probing)
+ return 0;
+
+ delfilter = strfilter__new(PERF_BPF_PROBE_GROUP ":*", NULL);
+ if (!delfilter) {
+ pr_err("Failed to create delfilter when unprobing\n");
+ return -ENOMEM;
+ }
+
+ ret = del_perf_probe_events(delfilter);
+ strfilter__delete(delfilter);
+ if (ret < 0 && is_probing)
+ pr_err("Error: failed to delete events: %s\n",
+ strerror(-ret));
+ else
+ is_probing = false;
+ return ret < 0 ? ret : 0;
+}
+
+int bpf__probe(void)
+{
+ int err;
+
+ if (nr_probe_events <= 0)
+ return 0;
+
+ probe_conf.max_probes = MAX_PROBES;
+ /* Let add_perf_probe_events keeps probe_trace_event */
+ err = add_perf_probe_events(probe_event_array,
+ nr_probe_events,
+ false);
+
+ /* add_perf_probe_events return negative when fail */
+ if (err < 0)
+ pr_err("bpf probe: failed to probe events\n");
+ else
+ is_probing = true;
+
+ return err < 0 ? err : 0;
+}
diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h
index 5a3c954..374aec0 100644
--- a/tools/perf/util/bpf-loader.h
+++ b/tools/perf/util/bpf-loader.h
@@ -12,6 +12,8 @@
#ifdef HAVE_LIBBPF_SUPPORT
int bpf__prepare_load(const char *filename, bool source);
+int bpf__probe(void);
+int bpf__unprobe(void);
void bpf__clear(void);
#else
@@ -22,6 +24,8 @@ static inline int bpf__prepare_load(const char *filename __maybe_unused,
return -1;
}
+static inline int bpf__probe(void) { return 0; }
+static inline int bpf__unprobe(void) { return 0; }
static inline void bpf__clear(void) { }
#endif
#endif
--
1.8.3.4
next prev parent reply other threads:[~2015-06-24 12:42 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 ` Wang Nan [this message]
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 ` [RFC PATCH v8 43/49] perf tools: Iterater over tev instead of pev in bpf__for_each_program Wang Nan
2015-06-26 8:29 ` 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-33-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®