diff options
author | Song Liu <songliubraving@fb.com> | 2019-03-12 01:30:48 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-03-19 15:52:07 -0400 |
commit | 9b86d04d53b98399017fea44e9047165ffe12d42 (patch) | |
tree | 0e996deedf0c15dff8c196e5d84030a4d4438333 | |
parent | 31be9478ed7f43d6351e0d5a2257ca76609c83d3 (diff) |
perf symbols: Introduce DSO_BINARY_TYPE__BPF_PROG_INFO
Introduce a new dso type DSO_BINARY_TYPE__BPF_PROG_INFO for BPF programs. In
symbol__disassemble(), DSO_BINARY_TYPE__BPF_PROG_INFO dso will call into a new
function symbol__disassemble_bpf() in an upcoming patch, where annotation line
information is filled based bpf_prog_info and btf saved in given perf_env.
Committer notes:
Removed the unnamed union with 'bpf_prog' and 'cache' in 'struct dso',
to fix this bug when exiting 'perf top':
# perf top
perf: Segmentation fault
-------- backtrace --------
perf[0x5a785a]
/lib64/libc.so.6(+0x385bf)[0x7fd68443c5bf]
perf(rb_first+0x2b)[0x4d6eeb]
perf(dso__delete+0xb7)[0x4dffb7]
perf[0x4f9e37]
perf(perf_session__delete+0x64)[0x504df4]
perf(cmd_top+0x1957)[0x454467]
perf[0x4aad18]
perf(main+0x61c)[0x42ec7c]
/lib64/libc.so.6(__libc_start_main+0xf2)[0x7fd684428412]
perf(_start+0x2d)[0x42eead]
#
# addr2line -fe ~/bin/perf 0x4dffb7
dso_cache__free
/home/acme/git/perf/tools/perf/util/dso.c:713
That is trying to access the dso->data.cache, and that is not used with
BPF programs, so we end up accessing what is in bpf_prog.first_member,
b00m.
Signed-off-by: Song Liu <songliubraving@fb.com>
Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stanislav Fomichev <sdf@google.com>
Cc: kernel-team@fb.com
Link: http://lkml.kernel.org/r/20190312053051.2690567-13-songliubraving@fb.com
[ split from a larger patch ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/dso.c | 1 | ||||
-rw-r--r-- | tools/perf/util/dso.h | 8 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 1 |
3 files changed, 10 insertions, 0 deletions
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index ab8a455d2283..e059976d9d93 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c | |||
@@ -184,6 +184,7 @@ int dso__read_binary_type_filename(const struct dso *dso, | |||
184 | case DSO_BINARY_TYPE__KALLSYMS: | 184 | case DSO_BINARY_TYPE__KALLSYMS: |
185 | case DSO_BINARY_TYPE__GUEST_KALLSYMS: | 185 | case DSO_BINARY_TYPE__GUEST_KALLSYMS: |
186 | case DSO_BINARY_TYPE__JAVA_JIT: | 186 | case DSO_BINARY_TYPE__JAVA_JIT: |
187 | case DSO_BINARY_TYPE__BPF_PROG_INFO: | ||
187 | case DSO_BINARY_TYPE__NOT_FOUND: | 188 | case DSO_BINARY_TYPE__NOT_FOUND: |
188 | ret = -1; | 189 | ret = -1; |
189 | break; | 190 | break; |
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index bb417c54c25a..6e3f63781e51 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | struct machine; | 15 | struct machine; |
16 | struct map; | 16 | struct map; |
17 | struct perf_env; | ||
17 | 18 | ||
18 | enum dso_binary_type { | 19 | enum dso_binary_type { |
19 | DSO_BINARY_TYPE__KALLSYMS = 0, | 20 | DSO_BINARY_TYPE__KALLSYMS = 0, |
@@ -35,6 +36,7 @@ enum dso_binary_type { | |||
35 | DSO_BINARY_TYPE__KCORE, | 36 | DSO_BINARY_TYPE__KCORE, |
36 | DSO_BINARY_TYPE__GUEST_KCORE, | 37 | DSO_BINARY_TYPE__GUEST_KCORE, |
37 | DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, | 38 | DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, |
39 | DSO_BINARY_TYPE__BPF_PROG_INFO, | ||
38 | DSO_BINARY_TYPE__NOT_FOUND, | 40 | DSO_BINARY_TYPE__NOT_FOUND, |
39 | }; | 41 | }; |
40 | 42 | ||
@@ -189,6 +191,12 @@ struct dso { | |||
189 | u64 debug_frame_offset; | 191 | u64 debug_frame_offset; |
190 | u64 eh_frame_hdr_offset; | 192 | u64 eh_frame_hdr_offset; |
191 | } data; | 193 | } data; |
194 | /* bpf prog information */ | ||
195 | struct { | ||
196 | u32 id; | ||
197 | u32 sub_id; | ||
198 | struct perf_env *env; | ||
199 | } bpf_prog; | ||
192 | 200 | ||
193 | union { /* Tool specific area */ | 201 | union { /* Tool specific area */ |
194 | void *priv; | 202 | void *priv; |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 58442ca5e3c4..5cbad55cd99d 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -1455,6 +1455,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod, | |||
1455 | case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: | 1455 | case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: |
1456 | return true; | 1456 | return true; |
1457 | 1457 | ||
1458 | case DSO_BINARY_TYPE__BPF_PROG_INFO: | ||
1458 | case DSO_BINARY_TYPE__NOT_FOUND: | 1459 | case DSO_BINARY_TYPE__NOT_FOUND: |
1459 | default: | 1460 | default: |
1460 | return false; | 1461 | return false; |