From: Song Liu <songliubraving@fb.com>
To: <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <ast@kernel.org>, <daniel@iogearbox.net>, <kernel-team@fb.com>,
<peterz@infradead.org>, <acme@redhat.com>, <jolsa@kernel.org>,
<namhyung@kernel.org>, Song Liu <songliubraving@fb.com>
Subject: [PATCH v5 perf,bpf 15/15] perf, bpf: save bpf_prog_info and btf of short living bpf programs
Date: Wed, 27 Feb 2019 21:06:43 -0800 [thread overview]
Message-ID: <20190228050643.958685-16-songliubraving@fb.com> (raw)
In-Reply-To: <20190228050643.958685-1-songliubraving@fb.com>
To fully annotate BPF programs with source code mapping, 4 different
information are needed:
1) PERF_RECORD_KSYMBOL
2) PERF_RECORD_BPF_EVENT
3) bpf_prog_info
4) btf
This patch handles 3) and 4) for short living BPF programs. For timely
process of these information, a dedicated event is added to the side
band evlist. When PERF_RECORD_BPF_EVENT is received via the side band
event, the polling thread gathers 3) and 4) vis sys_bpf and store them
in perf_env. These information are saved to perf.data at the end of
perf-record.
Signed-off-by: Song Liu <songliubraving@fb.com>
---
tools/perf/builtin-record.c | 3 ++
tools/perf/builtin-top.c | 3 ++
tools/perf/util/bpf-event.c | 66 +++++++++++++++++++++++++++++++++++++
tools/perf/util/bpf-event.h | 18 ++++++++++
tools/perf/util/evlist.c | 5 +++
5 files changed, 95 insertions(+)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index d10c1d5a9e89..ce26d37c2871 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1207,6 +1207,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
goto out_child;
}
+ if (opts->bpf_event)
+ bpf_event__add_polling_event();
+
poll_args.env = &session->header.env;
poll_args.done = &done;
perf_evlist__start_polling_thread(&rec->opts.target, &poll_args);
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index f41545445917..851c4dcce66f 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -1655,6 +1655,9 @@ int cmd_top(int argc, const char **argv)
top.record_opts.bpf_event = !top.no_bpf_event;
+ if (top.record_opts.bpf_event)
+ bpf_event__add_polling_event();
+
poll_args.env = &perf_env;
poll_args.done = &done;
perf_evlist__start_polling_thread(target, &poll_args);
diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c
index 048ef00371ad..664906237ffb 100644
--- a/tools/perf/util/bpf-event.c
+++ b/tools/perf/util/bpf-event.c
@@ -12,6 +12,7 @@
#include "machine.h"
#include "env.h"
#include "session.h"
+#include "evlist.h"
#define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr))
@@ -332,3 +333,68 @@ int perf_event__synthesize_bpf_events(struct perf_session *session,
free(event);
return err;
}
+
+void perf_env__add_bpf_info(struct perf_env *env, u32 id)
+{
+ struct bpf_prog_info_linear *info_linear;
+ struct bpf_prog_info_node *info_node;
+ struct btf *btf = NULL;
+ u64 arrays;
+ u32 btf_id;
+ int fd;
+
+ fd = bpf_prog_get_fd_by_id(id);
+ if (fd < 0)
+ return;
+
+ arrays = 1UL << BPF_PROG_INFO_JITED_KSYMS;
+ arrays |= 1UL << BPF_PROG_INFO_JITED_FUNC_LENS;
+ arrays |= 1UL << BPF_PROG_INFO_FUNC_INFO;
+ arrays |= 1UL << BPF_PROG_INFO_PROG_TAGS;
+ arrays |= 1UL << BPF_PROG_INFO_JITED_INSNS;
+ arrays |= 1UL << BPF_PROG_INFO_LINE_INFO;
+ arrays |= 1UL << BPF_PROG_INFO_JITED_LINE_INFO;
+
+ info_linear = bpf_program__get_prog_info_linear(fd, arrays);
+ if (IS_ERR_OR_NULL(info_linear)) {
+ pr_debug("%s: failed to get BPF program info. aborting\n", __func__);
+ goto out;
+ }
+
+ btf_id = info_linear->info.btf_id;
+
+ info_node = malloc(sizeof(struct bpf_prog_info_node));
+ if (info_node) {
+ info_node->info_linear = info_linear;
+ perf_env__insert_bpf_prog_info(env, info_node);
+ } else
+ free(info_linear);
+
+ if (btf_id == 0)
+ goto out;
+
+ if (btf__get_from_id(btf_id, &btf)) {
+ pr_debug("%s: failed to get BTF of id %u, aborting\n",
+ __func__, btf_id);
+ goto out;
+ }
+ perf_env__fetch_btf(env, btf_id, btf);
+
+out:
+ free(btf);
+ close(fd);
+}
+
+int bpf_event__add_polling_event(void)
+{
+ struct perf_event_attr attr = {
+ .type = PERF_TYPE_SOFTWARE,
+ .config = PERF_COUNT_SW_DUMMY,
+ .watermark = 1,
+ .bpf_event = 1,
+ .wakeup_watermark = 1,
+ .size = sizeof(attr), /* to capture ABI version */
+ };
+
+ return perf_evlist__new_side_band_event(&attr);
+}
diff --git a/tools/perf/util/bpf-event.h b/tools/perf/util/bpf-event.h
index b9ec394dc7c7..03a6f018e219 100644
--- a/tools/perf/util/bpf-event.h
+++ b/tools/perf/util/bpf-event.h
@@ -4,12 +4,17 @@
#include <linux/compiler.h>
#include <linux/rbtree.h>
+#include <pthread.h>
+#include <api/fd/array.h>
#include "event.h"
struct machine;
union perf_event;
+struct perf_env;
struct perf_sample;
struct record_opts;
+struct evlist;
+struct target;
struct bpf_prog_info_node {
struct bpf_prog_info_linear *info_linear;
@@ -31,6 +36,9 @@ int perf_event__synthesize_bpf_events(struct perf_session *session,
perf_event__handler_t process,
struct machine *machine,
struct record_opts *opts);
+int bpf_event__add_polling_event(void);
+void perf_env__add_bpf_info(struct perf_env *env, u32 id);
+
#else
static inline int machine__process_bpf_event(struct machine *machine __maybe_unused,
union perf_event *event __maybe_unused,
@@ -46,5 +54,15 @@ static inline int perf_event__synthesize_bpf_events(struct perf_session *session
{
return 0;
}
+
+static inline int bpf_event__add_polling_event(void)
+{
+ return 0;
+}
+
+void perf_env__add_bpf_info(struct perf_env *env __maybe_unused,
+ u32 id __maybe_unused)
+{
+}
#endif // HAVE_LIBBPF_SUPPORT
#endif
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 61b87c8111e6..58ac42878c0a 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1886,6 +1886,11 @@ static void *perf_evlist__poll_thread(void *arg)
pr_debug("processing vip event of type %d\n",
event->header.type);
switch (event->header.type) {
+ case PERF_RECORD_BPF_EVENT:
+ if (event->bpf_event.type != PERF_BPF_EVENT_PROG_LOAD)
+ break;
+ perf_env__add_bpf_info(args->env, event->bpf_event.id);
+ break;
default:
break;
}
--
2.17.1
prev parent reply other threads:[~2019-02-28 5:07 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-28 5:06 [PATCH v5 perf,bpf 00/15] perf annotation of BPF programs Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 01/15] perf, bpf: consider events with attr.bpf_event as side-band events Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 02/15] bpf: libbpf: introduce bpf_program__get_prog_info_linear() Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 03/15] bpf: bpftool: use bpf_program__get_prog_info_linear() in prog.c:do_dump() Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 04/15] perf, bpf: synthesize bpf events with bpf_program__get_prog_info_linear() Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 05/15] perf: change prototype of perf_event__synthesize_bpf_events() Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 06/15] perf, bpf: save bpf_prog_info in a rbtree in perf_env Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 07/15] perf, bpf: save bpf_prog_info information as headers to perf.data Song Liu
2019-03-04 13:52 ` Jiri Olsa
2019-03-04 19:36 ` Song Liu
2019-03-04 20:23 ` Jiri Olsa
2019-03-04 20:31 ` Song Liu
2019-03-04 13:52 ` Jiri Olsa
2019-03-04 13:52 ` Jiri Olsa
2019-03-04 19:41 ` Song Liu
2019-03-04 20:37 ` Jiri Olsa
2019-03-04 13:52 ` Jiri Olsa
2019-02-28 5:06 ` [PATCH v5 perf,bpf 08/15] perf, bpf: save btf in a rbtree in perf_env Song Liu
2019-03-04 13:52 ` Jiri Olsa
2019-03-04 19:43 ` Song Liu
2019-03-04 20:31 ` Jiri Olsa
2019-03-04 13:53 ` Jiri Olsa
2019-02-28 5:06 ` [PATCH v5 perf,bpf 09/15] perf, bpf: save btf information as headers to perf.data Song Liu
2019-03-04 13:52 ` Jiri Olsa
2019-02-28 5:06 ` [PATCH v5 perf,bpf 10/15] perf-top: add option --no-bpf-event Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 11/15] perf: add -lopcodes to feature-libbfd Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 12/15] perf, bpf: enable annotation of bpf program Song Liu
2019-03-04 13:52 ` Jiri Olsa
2019-03-04 13:53 ` Jiri Olsa
2019-03-04 20:52 ` Song Liu
2019-03-04 13:53 ` Jiri Olsa
2019-03-04 19:45 ` Song Liu
2019-03-04 20:37 ` Jiri Olsa
2019-03-04 20:43 ` Song Liu
2019-02-28 5:06 ` [PATCH v5 perf,bpf 13/15] perf, bpf: process PERF_BPF_EVENT_PROG_LOAD for annotation Song Liu
2019-03-04 13:53 ` Jiri Olsa
2019-02-28 5:06 ` [PATCH v5 perf,bpf 14/15] perf: introduce side band thread Song Liu
2019-02-28 5:06 ` Song Liu [this message]
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=20190228050643.958685-16-songliubraving@fb.com \
--to=songliubraving@fb.com \
--cc=acme@redhat.com \
--cc=ast@kernel.org \
--cc=daniel@iogearbox.net \
--cc=jolsa@kernel.org \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=namhyung@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=peterz@infradead.org \
/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®