Skip to content

Commit d56354d

Browse files
liu-song-6acmel
authored andcommitted
perf tools: Save bpf_prog_info and BTF of new BPF programs
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 BPF programs loaded after 'perf record|top'. 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. This information is saved to perf.data at the end of 'perf record'. Committer testing: The 'wakeup_watermark' member in 'struct perf_event_attr' is inside a unnamed union, so can't be used in a struct designated initialization with older gccs, get it out of that, isolating as 'attr.wakeup_watermark = 1;' to work with all gcc versions. We also need to add '--no-bpf-event' to the 'perf record' perf_event_attr tests in 'perf test', as the way that that test goes is to intercept the events being setup and looking if they match the fields described in the control files, since now it finds first the side band event used to catch the PERF_RECORD_BPF_EVENT, they all fail. With these issues fixed: Same scenario as for testing BPF programs loaded before 'perf record' or 'perf top' starts, only start the BPF programs after 'perf record|top', so that its information get collected by the sideband threads, the rest works as for the programs loaded before start monitoring. Add missing 'inline' to the bpf_event__add_sb_event() when HAVE_LIBBPF_SUPPORT is not defined, fixing the build in systems without binutils devel files installed. Signed-off-by: Song Liu <songliubraving@fb.com> Reviewed-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stanislav Fomichev <sdf@google.com> Link: http://lkml.kernel.org/r/20190312053051.2690567-16-songliubraving@fb.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent 657ee55 commit d56354d

28 files changed

+145
-24
lines changed

tools/perf/builtin-record.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
12381238
goto out_child;
12391239
}
12401240

1241+
if (!opts->no_bpf_event)
1242+
bpf_event__add_sb_event(&sb_evlist, &session->header.env);
1243+
12411244
if (perf_evlist__start_sb_thread(sb_evlist, &rec->opts.target)) {
12421245
pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n");
12431246
opts->no_bpf_event = true;

tools/perf/builtin-top.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,9 @@ int cmd_top(int argc, const char **argv)
16371637
goto out_delete_evlist;
16381638
}
16391639

1640+
if (!top.record_opts.no_bpf_event)
1641+
bpf_event__add_sb_event(&sb_evlist, &perf_env);
1642+
16401643
if (perf_evlist__start_sb_thread(sb_evlist, target)) {
16411644
pr_debug("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n");
16421645
opts->no_bpf_event = true;

tools/perf/tests/attr/test-record-C0

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -C 0 kill >/dev/null 2>&1
3+
args = --no-bpf-event -C 0 kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = kill >/dev/null 2>&1
3+
args = --no-bpf-event kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-any

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -b kill >/dev/null 2>&1
3+
args = --no-bpf-event -b kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-filter-any

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -j any kill >/dev/null 2>&1
3+
args = --no-bpf-event -j any kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-filter-any_call

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -j any_call kill >/dev/null 2>&1
3+
args = --no-bpf-event -j any_call kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-filter-any_ret

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -j any_ret kill >/dev/null 2>&1
3+
args = --no-bpf-event -j any_ret kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-filter-hv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -j hv kill >/dev/null 2>&1
3+
args = --no-bpf-event -j hv kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

tools/perf/tests/attr/test-record-branch-filter-ind_call

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[config]
22
command = record
3-
args = -j ind_call kill >/dev/null 2>&1
3+
args = --no-bpf-event -j ind_call kill >/dev/null 2>&1
44
ret = 1
55

66
[event:base-record]

0 commit comments

Comments
 (0)