perf tools: Display eBPF code in intel_pt trace
Jiri Olsa
reviewerv2 cover perf tools: Display eBPF code in intel_pt trace
hi,
this patchset adds dso support to read and display bpf code in intel_pt trace output. I had to change some of the kernel maps processing code, so hopefully I did not break too many things ;-)
It's now possible to see bpf code flow via:
# perf-with-kcore record pt -e intel_pt//ku -- sleep 1
# perf-with-kcore script pt --insn-trace --xed
...
sleep 36660 [016] 1057036.806464404: ffffffff811dfba5 trace_call_bpf+0x65 ([kernel.kallsyms]) nopl %eax, (%rax,%rax,1)
sleep 36660 [016] 1057036.806464404: ffffffff811dfbaa trace_call_bpf+0x6a ([kernel.kallsyms]) movq 0x30(%rbx), %rax
sleep 36660 [016] 1057036.806464404: ffffffff811dfbae trace_call_bpf+0x6e ([kernel.kallsyms]) leaq 0x38(%rbx), %rsi
sleep 36660 [016] 1057036.806464404: ffffffff811dfbb2 trace_call_bpf+0x72 ([kernel.kallsyms]) mov %r13, %rdi
sleep 36660 [016] 1057036.806464404: ffffffff811dfbb5 trace_call_bpf+0x75 ([kernel.kallsyms]) callq 0xffffffff81c00c30
sleep 36660 [016] 1057036.806464404: ffffffff81c00c30 __x86_indirect_thunk_rax+0x0 ([kernel.kallsyms]) callq 0xffffffff81c00c3c
sleep 36660 [016] 1057036.806464404: ffffffff81c00c3c __x86_indirect_thunk_rax+0xc ([kernel.kallsyms]) movq %rax, (%rsp)
sleep 36660 [016] 1057036.806464404: ffffffff81c00c40 __x86_indirect_thunk_rax+0x10 ([kernel.kallsyms]) retq
sleep 36660 [016] 1057036.806464725: ffffffffa05e89ef bpf_prog_da4fe6b3d2c29b25_trace_return+0x0 (bpf_prog_da4fe6b3d2c29b25_trace_return) pushq %rbp
sleep 36660 [016] 1057036.806464725: ffffffffa05e89f0 bpf_prog_da4fe6b3d2c29b25_trace_return+0x1 (bpf_prog_da4fe6b3d2c29b25_trace_return) mov %rsp, %rbp
sleep 36660 [016] 1057036.806464725: ffffffffa05e89f3 bpf_prog_da4fe6b3d2c29b25_trace_return+0x4 (bpf_prog_da4fe6b3d2c29b25_trace_return) sub $0x158, %rsp
sleep 36660 [016] 1057036.806464725: ffffffffa05e89fa bpf_prog_da4fe6b3d2c29b25_trace_return+0xb (bpf_prog_da4fe6b3d2c29b25_trace_return) sub $0x28, %rbp
sleep 36660 [016] 1057036.806464725: ffffffffa05e89fe bpf_prog_da4fe6b3d2c29b25_trace_return+0xf (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rbx, (%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a02 bpf_prog_da4fe6b3d2c29b25_trace_return+0x13 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r13, 0x8(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a06 bpf_prog_da4fe6b3d2c29b25_trace_return+0x17 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r14, 0x10(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a0a bpf_prog_da4fe6b3d2c29b25_trace_return+0x1b (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r15, 0x18(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a0e bpf_prog_da4fe6b3d2c29b25_trace_return+0x1f (bpf_prog_da4fe6b3d2c29b25_trace_return) xor %eax, %eax
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a10 bpf_prog_da4fe6b3d2c29b25_trace_return+0x21 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rax, 0x20(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a14 bpf_prog_da4fe6b3d2c29b25_trace_return+0x25 (bpf_prog_da4fe6b3d2c29b25_trace_return) mov %rdi, %rbx
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a17 bpf_prog_da4fe6b3d2c29b25_trace_return+0x28 (bpf_prog_da4fe6b3d2c29b25_trace_return) callq 0xffffffff811fed50
sleep 36660 [016] 1057036.806464725: ffffffff811fed50 bpf_get_current_pid_tgid+0x0 ([kernel.kallsyms]) nopl %eax, (%rax,%rax,1)
sleep 36660 [016] 1057036.806464725: ffffffff811fed55 bpf_get_current_pid_tgid+0x5 ([kernel.kallsyms]) movq %gs:0x15c00, %rdx
sleep 36660 [016] 1057036.806464725: ffffffff811fed5e bpf_get_current_pid_tgid+0xe ([kernel.kallsyms]) test %rdx, %rdx
sleep 36660 [016] 1057036.806464725: ffffffff811fed61 bpf_get_current_pid_tgid+0x11 ([kernel.kallsyms]) jz 0xffffffff811fed79
sleep 36660 [016] 1057036.806464725: ffffffff811fed63 bpf_get_current_pid_tgid+0x13 ([kernel.kallsyms]) movsxdl 0x494(%rdx), %rax
sleep 36660 [016] 1057036.806464725: ffffffff811fed6a bpf_get_current_pid_tgid+0x1a ([kernel.kallsyms]) movsxdl 0x490(%rdx), %rdx
sleep 36660 [016] 1057036.806464725: ffffffff811fed71 bpf_get_current_pid_tgid+0x21 ([kernel.kallsyms]) shl $0x20, %rax
sleep 36660 [016] 1057036.806464725: ffffffff811fed75 bpf_get_current_pid_tgid+0x25 ([kernel.kallsyms]) or %rdx, %rax
sleep 36660 [016] 1057036.806464725: ffffffff811fed78 bpf_get_current_pid_tgid+0x28 ([kernel.kallsyms]) retq
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a1c bpf_prog_da4fe6b3d2c29b25_trace_return+0x2d (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rax, -0x8(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a20 bpf_prog_da4fe6b3d2c29b25_trace_return+0x31 (bpf_prog_da4fe6b3d2c29b25_trace_return) xor %edi, %edi
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a22 bpf_prog_da4fe6b3d2c29b25_trace_return+0x33 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rdi, -0x10(%rbp)
sleep 36660 [016] 1057036.806464725: ffffffffa05e8a26 bpf_prog_da4fe6b3d2c29b25_trace_return+0x37 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rdi, -0x18(%rbp) # perf-core/perf-with-kcore script pt --call-trace
...
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) kretprobe_perf_func
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) trace_call_bpf
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_pid_tgid
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_ktime_get_ns
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return ) __htab_map_lookup_elem
sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms] ) memcmp
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_uid_gid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kgid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kuid
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_prepare_sample
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_misc_flags
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_raxv2 changes:
- fix missing pthread_mutex_unlock [Stanislav Fomichev]
- removed eBPF dso reusing [Adrian Hunter]
- merge eBPF and kcore maps [Adrian Hunter]
- few patches already applied
- added some perf script helper options
- patches are rebased on top of Arnaldo's perf/core with perf/urgent merged in
It's also available in here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/fixes
thanks,
jirka
---
Jiri Olsa (12):
perf tools: Separate generic code in dso__data_file_size perf tools: Separate generic code in dso_cache__read perf tools: Simplify dso_cache__read function
perf tools: Add bpf dso read and size hooks
perf tools: Read also the end of the kernel
perf tools: Keep zero in pgoff bpf map
perf script: Pad dso name for --call-trace
perf tools: Preserve eBPF maps when loading kcore perf tests: Add map_groups__merge_in test
perf script: Add --show-bpf-events to show eBPF related events perf script: Remove superfluous bpf event titles perf script: Add --show-all-events option
tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/Documentation/perf-script.txt | 6 ++++++ tools/perf/builtin-script.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 4 ++++ tools/perf/tests/map_groups.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/util/dso.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ tools/perf/util/event.c | 4 ++-- tools/perf/util/machine.c | 31 ++++++++++++++++++++----------- tools/perf/util/map.c | 6 ++++++ tools/perf/util/map_groups.h | 2 ++ tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- tools/perf/util/symbol_conf.h | 1 + 15 files changed, 421 insertions(+), 53 deletions(-) create mode 100644 tools/perf/tests/map_groups.c
Jiri Olsa
reviewerPATCH v2 1/12 perf tools: Separate generic code in dso__data_file_size
Moving file specific code in dso__data_file_size function into separate file_size function. I'll add bpf specific code in following patches.
--- tools/perf/util/dso.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
tools/perf/util/dso.c +12 -7
@@ -898,18 +898,12 @@ static ssize_t cached_read(struct dso *dso, struct machine *machine,return r; } -int dso__data_file_size (struct dso *dso,struct machine *machine) +static int file_size (struct dso *dso,struct machine *machine) {int ret =0 ;struct stat st;char sbuf[STRERR_BUFSIZE ]; -if (dso->data.file_size) -return 0 ; - -if (dso->data.status ==DSO_DATA_STATUS_ERROR ) -return -1 ; -pthread_mutex_lock (&dso__data_open_lock);/*
@@ -938,6 +932,17 @@ int dso__data_file_size(struct dso *dso, struct machine *machine)return ret; } +int dso__data_file_size (struct dso *dso,struct machine *machine) +{ +if (dso->data.file_size) +return 0 ; + +if (dso->data.status ==DSO_DATA_STATUS_ERROR ) +return -1 ; + +return file_size (dso, machine); +} +/** * dso__data_size - Return dso data size * @dso: dso object
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 2/12 perf tools: Separate generic code in dso_cache__read
In reply to Jiri OlsaMoving file specific code in dso_cache__read function into separate file_read function. I'll add bpf specific code in following patches.
--- tools/perf/util/dso.c | 48 ++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 21 deletions(-)
tools/perf/util/dso.c +27 -21
@@ -794,6 +794,31 @@ dso_cache__memcpy(struct dso_cache *cache, u64 offset,return cache_size; } +static ssize_t file_read (struct dso *dso,struct machine *machine, +u64 offset,char *data) +{ +ssize_t ret; + +pthread_mutex_lock (&dso__data_open_lock); + +/* +* dso->data.fd might be closed if other thread opened another +* file (dso) due to open file limit (RLIMIT_NOFILE). +*/ +try_to_open_dso (dso, machine); + +if (dso->data.fd <0 ) { + dso->data.status =DSO_DATA_STATUS_ERROR ; + ret = -errno; + goto out; + } + + ret =pread (dso->data.fd, data,DSO__DATA_CACHE_SIZE , offset); +out: +pthread_mutex_unlock (&dso__data_open_lock); +return ret; +} +static ssize_t dso_cache__read (struct dso *dso,struct machine *machine,u64 offset,u8 *data,ssize_t size)
@@ -803,37 +828,18 @@ dso_cache__read(struct dso *dso, struct machine *machine,ssize_t ret;do { -u64 cache_offset; +u64 cache_offset = offset &DSO__DATA_CACHE_MASK ; cache =zalloc (sizeof (*cache) +DSO__DATA_CACHE_SIZE );if (!cache)return -ENOMEM ; -pthread_mutex_lock (&dso__data_open_lock); - -/* -* dso->data.fd might be closed if other thread opened another -* file (dso) due to open file limit (RLIMIT_NOFILE). -*/ -try_to_open_dso (dso, machine); - -if (dso->data.fd <0 ) { - ret = -errno; - dso->data.status =DSO_DATA_STATUS_ERROR ; -break ; - } - - cache_offset = offset &DSO__DATA_CACHE_MASK ; - - ret =pread (dso->data.fd, cache->data,DSO__DATA_CACHE_SIZE , cache_offset); -if (ret <=0 ) -break ; + ret =file_read (dso, machine, cache_offset, cache->data); cache->offset = cache_offset; cache->size = ret; }while (0 ); -pthread_mutex_unlock (&dso__data_open_lock);if (ret >0 ) { old =dso_cache__insert (dso, cache);
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 3/12 perf tools: Simplify dso_cache__read function
In reply to Jiri OlsaThere's no need for the while loop now, also we can connect two (ret > 0) condition legs together.
--- tools/perf/util/dso.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
tools/perf/util/dso.c +6 -11
@@ -823,25 +823,20 @@ static ssize_t dso_cache__read(struct dso *dso, struct machine *machine, u64 offset, u8 *data, ssize_t size) { + u64 cache_offset = offset & DSO__DATA_CACHE_MASK;struct dso_cache *cache;struct dso_cache *old;ssize_t ret; -do { -u64 cache_offset = offset &DSO__DATA_CACHE_MASK ; - - cache =zalloc (sizeof (*cache) +DSO__DATA_CACHE_SIZE ); -if (!cache) -return -ENOMEM ; - - ret =file_read (dso, machine, cache_offset, cache->data); + cache =zalloc (sizeof (*cache) +DSO__DATA_CACHE_SIZE ); +if (!cache) +return -ENOMEM ; + ret =file_read (dso, machine, cache_offset, cache->data); +if (ret >0 ) { cache->offset = cache_offset; cache->size = ret; - }while (0 ); - -if (ret >0 ) { old =dso_cache__insert (dso, cache);if (old) {/* we lose the race */
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 4/12 perf tools: Add bpf dso read and size hooks
In reply to Jiri OlsaAdding bpf related code into dso reading paths to return size (bpf_size) and read the bpf code (bpf_read).
--- tools/perf/util/dso.c | 49 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-)
tools/perf/util/dso.c +48 -1
@@ -9,6 +9,8 @@#include <errno.h> #include <fcntl.h> #include <libgen.h> +#include <bpf/libbpf.h> +#include "bpf-event.h" #include "compress.h" #include "namespaces.h" #include "path.h"
@@ -706,6 +708,44 @@ bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by)return false; } +static ssize_t bpf_read (struct dso *dso,u64 offset,char *data) +{ +struct bpf_prog_info_node *node; +ssize_t size =DSO__DATA_CACHE_SIZE ; +u64 len; +u8 *buf; + + node =perf_env__find_bpf_prog_info (dso->bpf_prog.env, dso->bpf_prog.id); +if (!node || !node->info_linear) { + dso->data.status =DSO_DATA_STATUS_ERROR ; +return -1 ; + } + + len = node->info_linear->info.jited_prog_len; + buf = (u8 *) node->info_linear->info.jited_prog_insns; + +if (offset >= len) +return -1 ; + + size = (ssize_t )min (len - offset, (u64 ) size); +memcpy (data, buf + offset, size); +return size; +} + +static int bpf_size (struct dso *dso) +{ +struct bpf_prog_info_node *node; + + node =perf_env__find_bpf_prog_info (dso->bpf_prog.env, dso->bpf_prog.id); +if (!node || !node->info_linear) { + dso->data.status =DSO_DATA_STATUS_ERROR ; +return -1 ; + } + + dso->data.file_size = node->info_linear->info.jited_prog_len; +return 0 ; +} +static void dso_cache__free (struct dso *dso) {
@@ -832,7 +872,11 @@ dso_cache__read(struct dso *dso, struct machine *machine,if (!cache)return -ENOMEM ; - ret =file_read (dso, machine, cache_offset, cache->data); +if (dso->binary_type ==DSO_BINARY_TYPE__BPF_PROG_INFO ) + ret =bpf_read (dso, cache_offset, cache->data); +else + ret =file_read (dso, machine, cache_offset, cache->data); +if (ret >0 ) { cache->offset = cache_offset; cache->size = ret;
@@ -941,6 +985,9 @@ int dso__data_file_size(struct dso *dso, struct machine *machine)if (dso->data.status ==DSO_DATA_STATUS_ERROR )return -1 ; +if (dso->binary_type ==DSO_BINARY_TYPE__BPF_PROG_INFO ) +return bpf_size (dso); +return file_size (dso, machine); }
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 5/12 perf tools: Read also the end of the kernel
In reply to Jiri OlsaWe mark the end of kernel based on the first module, but that could cover some bpf program maps. Reading _etext symbol if it's present to get precise kernel map end.
--- tools/perf/util/machine.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
tools/perf/util/machine.c +18 -9
@@ -924,7 +924,8 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};* symbol_name if it's not that important. */ static int machine__get_running_kernel_start (struct machine *machine, -const char **symbol_name,u64 *start) +const char **symbol_name, +u64 *start,u64 *end) {char filename[PATH_MAX ];int i, err =-1 ;
@@ -949,6 +950,11 @@ static int machine__get_running_kernel_start(struct machine *machine, *symbol_name = name; *start = addr; + + err =kallsyms__get_function_start (filename,"_etext" , &addr); +if (!err) + *end = addr; +return 0 ; }
@@ -1440,7 +1446,7 @@ int machine__create_kernel_maps(struct machine *machine)struct dso *kernel =machine__get_kernel (machine);const char *name =NULL ;struct map *map; -u64 addr =0 ; +u64 start =0 , end = ~0ULL ;int ret;if (kernel ==NULL )
@@ -1459,9 +1465,9 @@ int machine__create_kernel_maps(struct machine *machine) "continuing anyway...\n", machine->pid); } -if (!machine__get_running_kernel_start (machine, &name, &addr)) { +if (!machine__get_running_kernel_start (machine, &name, &start, &end)) {if (name && -map__set_kallsyms_ref_reloc_sym (machine->vmlinux_map, name, addr)) { +map__set_kallsyms_ref_reloc_sym (machine->vmlinux_map, name, start)) {machine__destroy_kernel_maps (machine); ret =-1 ; goto out_put;
@@ -1471,16 +1477,19 @@ int machine__create_kernel_maps(struct machine *machine)* we have a real start address now, so re-order the kmaps * assume it's the last in the kmaps */ -machine__update_kernel_mmap (machine, addr, ~0ULL ); +machine__update_kernel_mmap (machine, start, end); }if (machine__create_extra_kernel_maps (machine, kernel))pr_debug ("Problems creating extra kernel maps, continuing anyway...\n" ); -/* update end address of the kernel map using adjacent module address */ - map =map__next (machine__kernel_map (machine)); -if (map) -machine__set_kernel_mmap (machine, addr, map->start); +if (end == ~0ULL ) { +/* update end address of the kernel map using adjacent module address */ + map =map__next (machine__kernel_map (machine)); +if (map) +machine__set_kernel_mmap (machine, start, map->start); + } + out_put:dso__put (kernel);return ret;
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 6/12 perf tools: Keep zero in pgoff bpf map
In reply to Jiri OlsaWith pgoff set to zero, the map__map_ip function
will return bpf address based from 0, which is
what we need when we read the data from bpf dso.
Adding bpf symbols with mapped ip addresses as well.
--- tools/perf/util/machine.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/machine.c +2 -2
@@ -704,12 +704,12 @@ static int machine__process_ksymbol_register(struct machine *machine,return -ENOMEM ; map->start = event->ksymbol_event.addr; - map->pgoff = map->start; map->end = map->start + event->ksymbol_event.len;map_groups__insert (&machine->kmaps, map); } - sym =symbol__new (event->ksymbol_event.addr, event->ksymbol_event.len, + sym =symbol__new (map->map_ip (map, map->start), + event->ksymbol_event.len,0 ,0 , event->ksymbol_event.name);if (!sym)return -ENOMEM ;
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 7/12 perf script: Pad dso name for --call-trace
In reply to Jiri OlsaPadding dso name for --call-trace so we don't have the indent screwed by different dso name lengths, as now for kernel there's also bpf code displayed.
# perf-with-kcore record pt -e intel_pt//ku -- sleep 1 # perf-core/perf-with-kcore script pt --call-trace
Before:
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) kretprobe_perf_func
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) trace_call_bpf
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_get_current_pid_tgid
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_ktime_get_ns
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return) __htab_map_lookup_elem
sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms]) memcmp
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_get_current_uid_gid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms]) from_kgid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms]) from_kuid
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_prepare_sample
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_misc_flags
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806466328: ([kvm]) kvm_is_in_guest
sleep 36660 [016] 1057036.806466649: ([kernel.kallsyms]) __perf_event_header__init_id.isra.0
sleep 36660 [016] 1057036.806466649: ([kernel.kallsyms]) perf_output_beginAfter:
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) kretprobe_perf_func
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) trace_call_bpf
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_pid_tgid
sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_ktime_get_ns
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return ) __htab_map_lookup_elem
sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms] ) memcmp
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object
sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_uid_gid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kgid
sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kuid
sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_event_output
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_prepare_sample
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_misc_flags
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_rax
sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_rax--- tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/builtin-script.c | 1 + tools/perf/util/map.c | 6 ++++++ tools/perf/util/symbol_conf.h | 1 + 5 files changed, 28 insertions(+)
tools/include/linux/kernel.h +1 -0
@@ -102,6 +102,7 @@int vscnprintf (char *buf,size_t size,const char *fmt,va_list args);int scnprintf (char * buf,size_t size,const char * fmt, ...); +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...);#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
tools/lib/vsprintf.c +19 -0
@@ -23,3 +23,22 @@ int scnprintf(char * buf, size_t size, const char * fmt, ...)return (i >= ssize) ? (ssize -1 ) : i; } + +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...) +{ +ssize_t ssize = size; +va_list args; +int i; + +va_start (args, fmt); + i =vsnprintf (buf, size, fmt, args); +va_end (args); + +if (i < (int ) size) { +for (; i < (int ) size; i++) + buf[i] =' ' ; + buf[i] =0x0 ; + } + +return (i >= ssize) ? (ssize -1 ) : i; +}
tools/perf/builtin-script.c +1 -0
@@ -3297,6 +3297,7 @@ static int parse_call_trace(const struct option *opt __maybe_unused,parse_output_fields (NULL ,"-ip,-addr,-event,-period,+callindent" ,0 );itrace_parse_synth_opts (opt,"cewp" ,0 ); symbol_conf.nanosecs = true; + symbol_conf.pad_output_len_dso =50 ;return 0 ; }
tools/perf/util/map.c +6 -0
@@ -405,6 +405,7 @@ size_t map__fprintf(struct map *map, FILE *fp)size_t map__fprintf_dsoname (struct map *map,FILE *fp) { +char buf[PATH_MAX ];const char *dsoname ="[unknown]" ;if (map && map->dso) {
@@ -414,6 +415,11 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) dsoname = map->dso->name; } +if (symbol_conf.pad_output_len_dso) { +scnprintf_pad (buf, symbol_conf.pad_output_len_dso,"%s" , dsoname); + dsoname = buf; + } +return fprintf (fp,"%s" , dsoname); }
tools/perf/util/symbol_conf.h +1 -0
@@ -69,6 +69,7 @@ struct symbol_conf { *tid_list;const char *symfs;int res_sample; +int pad_output_len_dso; };extern struct symbol_conf symbol_conf;
Signature · 1 line
2.20.1
Re: [PATCH 07/12] perf script: Pad dso name for --call-trace
Quoted 103 lines · Jiri Olsa
Padding dso name for --call-trace so we don't have the indent screwed by different dso name lengths, as now for kernel there's also bpf code displayed.
# perf-with-kcore record pt -e intel_pt//ku -- sleep 1 # perf-core/perf-with-kcore script pt --call-traceBefore:
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) kretprobe_perf_func sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) trace_call_bpf sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_get_current_pid_tgid sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_ktime_get_ns sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return) __htab_map_lookup_elem sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms]) memcmp sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms]) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_get_current_uid_gid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms]) from_kgid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms]) from_kuid sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return) bpf_perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_prepare_sample sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) perf_misc_flags sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms]) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806466328: ([kvm]) kvm_is_in_guest sleep 36660 [016] 1057036.806466649: ([kernel.kallsyms]) __perf_event_header__init_id.isra.0 sleep 36660 [016] 1057036.806466649: ([kernel.kallsyms]) perf_output_beginAfter:
sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) kretprobe_perf_func sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) trace_call_bpf sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_pid_tgid sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_ktime_get_ns sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return ) __htab_map_lookup_elem sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms] ) memcmp sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_uid_gid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kgid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kuid sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_prepare_sample sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_misc_flags sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_raxSigned-off-by Jiri Olsa <[email protected]>---
tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/builtin-script.c | 1 + tools/perf/util/map.c | 6 ++++++ tools/perf/util/symbol_conf.h | 1 + 5 files changed, 28 insertions(+)tools/include/linux/kernel.h +1
-0@@ -102,6 +102,7 @@int vscnprintf (char *buf,size_t size,const char *fmt,va_list args);int scnprintf (char * buf,size_t size,const char * fmt, ...); +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...);#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))tools/lib/vsprintf.c +0
-0
tools/lib/vsprintf.c int scnprintf(char * buf, size_t size, const char * fmt, ...) · line 31
Quoted 9 lines
tools/lib/vsprintf.c +6
-0@@ -23,3 +23,22 @@ int scnprintf(char * buf, size_t size, const char * fmt, ...)return (i >= ssize) ? (ssize -1 ) : i; } + +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...) +{ +ssize_t ssize = size; +va_list args; +int i;
nit: I guess we can avoid mixing int, ssize_t and size_t here?
Quoted 30 lines
tools/lib/vsprintf.c +13
-0+ +va_start (args, fmt); + i =vsnprintf (buf, size, fmt, args); +va_end (args); + +if (i < (int ) size) { +for (; i < (int ) size; i++) + buf[i] =' ' ; + buf[i] =0x0 ; + } + +return (i >= ssize) ? (ssize -1 ) : i; +}tools/perf/builtin-script.c +1
-0@@ -3297,6 +3297,7 @@ static int parse_call_trace(const struct option *opt __maybe_unused,parse_output_fields (NULL ,"-ip,-addr,-event,-period,+callindent" ,0 );itrace_parse_synth_opts (opt,"cewp" ,0 ); symbol_conf.nanosecs = true; + symbol_conf.pad_output_len_dso =50 ;return 0 ; }tools/perf/util/map.c +0
-0
tools/perf/util/map.c size_t map__fprintf(struct map *map, FILE *fp) · line 408
Quoted 4 lines
tools/perf/util/map.c +1
-0@@ -405,6 +405,7 @@ size_t map__fprintf(struct map *map, FILE *fp)size_t map__fprintf_dsoname (struct map *map,FILE *fp) { +char buf[PATH_MAX ];
nit: PATH_MAX vs. 50 is a little weird.
Quoted 30 lines
tools/perf/util/map.c +5
-0const char *dsoname ="[unknown]" ;if (map && map->dso) {@@ -414,6 +415,11 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) dsoname = map->dso->name; } +if (symbol_conf.pad_output_len_dso) { +scnprintf_pad (buf, symbol_conf.pad_output_len_dso,"%s" , dsoname); + dsoname = buf; + } +return fprintf (fp,"%s" , dsoname); }tools/perf/util/symbol_conf.h +1
-0@@ -69,6 +69,7 @@ struct symbol_conf { *tid_list;const char *symfs;int res_sample; +int pad_output_len_dso; };extern struct symbol_conf symbol_conf;Signature · 1 line
2.20.1
Re: [PATCH 07/12] perf script: Pad dso name for --call-trace
On Mon, May 06, 2019 at 09:38:55PM +0000, Song Liu wrote:
SNIP
Quoted 29 lines
Quoted 29 lines
Signed-off-by Jiri Olsa <[email protected]>---
tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/builtin-script.c | 1 + tools/perf/util/map.c | 6 ++++++ tools/perf/util/symbol_conf.h | 1 + 5 files changed, 28 insertions(+)tools/include/linux/kernel.h +1
-0@@ -102,6 +102,7 @@int vscnprintf (char *buf,size_t size,const char *fmt,va_list args);int scnprintf (char * buf,size_t size,const char * fmt, ...); +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...);#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))tools/lib/vsprintf.c +0
-0@@ -23,3 +23,22 @@ int scnprintf(char * buf, size_t size, const char * fmt, ...)
Quoted 10 lines
tools/lib/vsprintf.c int scnprintf(char * buf, size_t size, const char * fmt, ...) · line 31
Quoted 8 lines
tools/lib/vsprintf.c +6
-0return (i >= ssize) ? (ssize -1 ) : i; } + +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...) +{ +ssize_t ssize = size; +va_list args; +int i;nit: I guess we can avoid mixing int,
ssize_tandsize_there?
I copied that from scnprintf ;-)
the thing is that at the end we call vsnprintf, which takes size_t as size param and returns int, so there will be casting at some point in any case..
I guess the ssize_t was introduced to compare the size_t value with int
Quoted 33 lines
Quoted 33 lines
tools/lib/vsprintf.c +13
-0+ +va_start (args, fmt); + i =vsnprintf (buf, size, fmt, args); +va_end (args); + +if (i < (int ) size) { +for (; i < (int ) size; i++) + buf[i] =' ' ; + buf[i] =0x0 ; + } + +return (i >= ssize) ? (ssize -1 ) : i; +}tools/perf/builtin-script.c +1
-0@@ -3297,6 +3297,7 @@ static int parse_call_trace(const struct option *opt __maybe_unused,parse_output_fields (NULL ,"-ip,-addr,-event,-period,+callindent" ,0 );itrace_parse_synth_opts (opt,"cewp" ,0 ); symbol_conf.nanosecs = true; + symbol_conf.pad_output_len_dso =50 ;return 0 ; }tools/perf/util/map.c +0
-0@@ -405,6 +405,7 @@ size_t map__fprintf(struct map *map, FILE *fp)
Quoted 5 lines
tools/perf/util/map.c size_t map__fprintf(struct map *map, FILE *fp) · line 408
Quoted 3 lines
tools/perf/util/map.c +1
-0size_t map__fprintf_dsoname (struct map *map,FILE *fp) { +char buf[PATH_MAX ];nit:
PATH_MAXvs. 50 is a little weird.
right, the "staying on the safe side" is too big here, will change
thanks,
jirka
Re: [PATCH 07/12] perf script: Pad dso name for --call-trace
Quoted 48 lines · Jiri Olsa
On Mon, May 06, 2019 at 09:38:55PM +0000, Song Liu wrote:
SNIP
Quoted 29 lines
Quoted 29 lines
Signed-off-by Jiri Olsa <[email protected]>---
tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/builtin-script.c | 1 + tools/perf/util/map.c | 6 ++++++ tools/perf/util/symbol_conf.h | 1 + 5 files changed, 28 insertions(+)tools/include/linux/kernel.h +1
-0@@ -102,6 +102,7 @@int vscnprintf (char *buf,size_t size,const char *fmt,va_list args);int scnprintf (char * buf,size_t size,const char * fmt, ...); +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...);#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))tools/lib/vsprintf.c +0
-0@@ -23,3 +23,22 @@ int scnprintf(char * buf, size_t size, const char * fmt, ...)Quoted 10 lines
tools/lib/vsprintf.c int scnprintf(char * buf, size_t size, const char * fmt, ...) · line 31
Quoted 8 lines
tools/lib/vsprintf.c +6
-0return (i >= ssize) ? (ssize -1 ) : i; } + +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...) +{ +ssize_t ssize = size; +va_list args; +int i;nit: I guess we can avoid mixing int,
ssize_tandsize_there?
Quoted 8 lines
I copied that from scnprintf ;-)
the thing is that at the end we call vsnprintf, which takes
size_tas size param and returns int, so there will be casting at some point in any case..I guess the
ssize_twas introduced to compare thesize_tvalue with int
Interesting. Given scnprintf works fine, I think we can keep the patch as-is.
Thanks,
Song
Re: [PATCH 07/12] perf script: Pad dso name for --call-trace
Quoted 54 lines · Song Liu
Quoted 54 lines · Jiri Olsa
On Mon, May 06, 2019 at 09:38:55PM +0000, Song Liu wrote:
SNIP
Quoted 29 lines
Quoted 29 lines
Signed-off-by Jiri Olsa <[email protected]>---
tools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/builtin-script.c | 1 + tools/perf/util/map.c | 6 ++++++ tools/perf/util/symbol_conf.h | 1 + 5 files changed, 28 insertions(+)tools/include/linux/kernel.h +1
-0@@ -102,6 +102,7 @@int vscnprintf (char *buf,size_t size,const char *fmt,va_list args);int scnprintf (char * buf,size_t size,const char * fmt, ...); +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...);#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))tools/lib/vsprintf.c +0
-0@@ -23,3 +23,22 @@ int scnprintf(char * buf, size_t size, const char * fmt, ...)Quoted 10 lines
tools/lib/vsprintf.c int scnprintf(char * buf, size_t size, const char * fmt, ...) · line 31
Quoted 8 lines
tools/lib/vsprintf.c +6
-0return (i >= ssize) ? (ssize -1 ) : i; } + +int scnprintf_pad (char * buf,size_t size,const char * fmt, ...) +{ +ssize_t ssize = size; +va_list args; +int i;nit: I guess we can avoid mixing int,
ssize_tandsize_there?I copied that from scnprintf ;-)
the thing is that at the end we call vsnprintf, which takes
size_tas size param and returns int, so there will be casting at some point in any case..
Quoted 5 lines
Quoted 2 lines
I guess the
ssize_twas introduced to compare thesize_tvalue with intInteresting. Given scnprintf works fine, I think we can keep the patch as-is.
I actualy found off by one issue in here.. I'll send new version
thanks,
jirka
Jiri Olsa
reviewerPATCH v2 8/12 perf tools: Preserve eBPF maps when loading kcore
In reply to Jiri OlsaWe need to preserve eBPF maps even if they are covered by kcore, because we need to access eBPF dso for source data.
Adding map_groups__merge_in function to do that. It merges map into map_groups by splitting the new map within the existing map regions.
--- tools/perf/util/symbol.c | 97 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 4 deletions(-)
tools/perf/util/symbol.c +93 -4
@@ -1166,6 +1166,85 @@ static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)return 0 ; } +/* +* Merges map into map_groups by splitting the new map +* within the existing map regions. +*/ +static int map_groups__merge_in (struct map_groups *kmaps,struct map *new_map) +{ +struct map *old_map; +LIST_HEAD (merged); + +for (old_map =map_groups__first (kmaps); old_map; + old_map =map_groups__next (old_map)) { + +/* no overload with this one */ +if (new_map->end < old_map->start || + new_map->start >= old_map->end) +continue ; + +if (new_map->start < old_map->start) { +/* +* |new...... +* |old.... +*/ +if (new_map->end < old_map->end) { +/* +* |new......| -> |new..| +* |old....| -> |old....| +*/ + new_map->end = old_map->start; + }else { +/* +* |new.............| -> |new..| |new..| +* |old....| -> |old....| +*/ +struct map *m =map__clone (new_map); + +if (!m) +return -ENOMEM ; + + m->end = old_map->start; +list_add_tail (&m->node, &merged); + new_map->start = old_map->end; + } + }else { +/* +* |new...... +* |old.... +*/ +if (new_map->end < old_map->end) { +/* +* |new..| -> x +* |old.........| -> |old.........| +*/ +map__put (new_map); + new_map =NULL ; +break ; + }else { +/* +* |new......| -> |new...| +* |old....| -> |old....| +*/ + new_map->start = old_map->end; + } + } + } + +while (!list_empty (&merged)) { + old_map = list_entry(merged.next, struct map, node); +list_del_init (&old_map->node); +map_groups__insert (kmaps, old_map); +map__put (old_map); + } + +if (new_map) { +map_groups__insert (kmaps, new_map); +map__put (new_map); + } +return 0 ; +} +static int dso__load_kcore (struct dso *dso,struct map *map,const char *kallsyms_filename) {
@@ -1222,7 +1301,12 @@ static int dso__load_kcore(struct dso *dso, struct map *map,while (old_map) {struct map *next =map_groups__next (old_map); -if (old_map != map) +/* +* We need to preserve eBPF maps even if they are +* covered by kcore, because we need to access +* eBPF dso for source data. +*/ +if (old_map != map && !__map__is_bpf_prog (old_map))map_groups__remove (kmaps, old_map); old_map = next; }
@@ -1256,11 +1340,16 @@ static int dso__load_kcore(struct dso *dso, struct map *map,map_groups__remove (kmaps, map);map_groups__insert (kmaps, map);map__put (map); +map__put (new_map); }else { -map_groups__insert (kmaps, new_map); +/* +* Merge kcore map into existing maps, +* and ensure that current maps (eBPF) +* stay intact. +*/ +if (map_groups__merge_in (kmaps, new_map)) + goto out_err; } - -map__put (new_map); }if (machine__is (machine,"x86_64" )) {
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 9/12 perf tests: Add map_groups__merge_in test
In reply to Jiri OlsaAdding map_groups__merge_in to test map_groups__merge_in function usage - merging kcore maps into existing eBPF maps.
--- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 4 ++ tools/perf/tests/map_groups.c | 120 ++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/util/map_groups.h | 2 + tools/perf/util/symbol.c | 2 +- 6 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 tools/perf/tests/map_groups.c
tools/perf/tests/Build +1 -0
@@ -50,6 +50,7 @@ perf-y += perf-hooks.o perf-y += clang.o perf-y += unit_number__scnprintf.o perf-y += mem2node.o +perf-y += map_groups.o $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build $(call rule_mkdir)
tools/perf/tests/builtin-test.c +4 -0
@@ -289,6 +289,10 @@ static struct test generic_tests[] = { .desc = "mem2node", .func = test__mem2node, }, + { + .desc = "map_groups__merge_in", + .func = test__map_groups__merge_in, + }, { .func = NULL, },
tools/perf/tests/map_groups.c new file +120 -0
120 lines not on this page · raw message
tools/perf/tests/tests.h +1 -0
@@ -107,6 +107,7 @@ const char *test__clang_subtest_get_desc(int subtest);int test__clang_subtest_get_nr (void );int test__unit_number__scnprint (struct test *test,int subtest);int test__mem2node (struct test *t,int subtest); +int test__map_groups__merge_in (struct test *t,int subtest);bool test__bp_signal_is_supported (void );bool test__wp_is_supported (void );
tools/perf/util/map_groups.h +2 -0
@@ -88,4 +88,6 @@ int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, FILEstruct map *map_groups__find_by_name (struct map_groups *mg,const char *name); +int map_groups__merge_in (struct map_groups *kmaps,struct map *new_map); +#endif // __PERF_MAP_GROUPS_H
tools/perf/util/symbol.c +1 -1
@@ -1170,7 +1170,7 @@ static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)* Merges map into map_groups by splitting the new map * within the existing map regions. */ -static int map_groups__merge_in (struct map_groups *kmaps,struct map *new_map) +int map_groups__merge_in (struct map_groups *kmaps,struct map *new_map) {struct map *old_map;LIST_HEAD (merged);
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 10/12 perf script: Add --show-bpf-events to show eBPF related events
In reply to Jiri OlsaAdding --show-bpf-events to show eBPF related events:
PERF_RECORD_KSYMBOL
PERF_RECORD_BPF_EVENT
Usage:
# perf record -a ... # perf script --show-bpf-events ... swapper 0 [000] 0.000000: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0ef971d len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 swapper 0 [000] 0.000000: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 36 ...
--- tools/perf/Documentation/perf-script.txt | 3 ++ tools/perf/builtin-script.c | 42 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+)
tools/perf/Documentation/perf-script.txt +3 -0
@@ -313,6 +313,9 @@ OPTIONS --show-round-events Display finished round events i.e. events of type PERF_RECORD_FINISHED_ROUND. +--show-bpf-events + Display bpf events i.e. events of type PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT. + --demangle:: Demangle symbol names to human readable form. It's enabled by default, disable with --no-demangle.
tools/perf/builtin-script.c +42 -0
66 lines not on this page · raw message
Signature · 1 line
2.20.1
Re: [PATCH 10/12] perf script: Add --show-bpf-events to show eBPF related events
Quoted 93 lines · Jiri Olsa
Adding --show-bpf-events to show eBPF related events:
PERF_RECORD_KSYMBOL
PERF_RECORD_BPF_EVENTUsage:
# perf record -a ... # perf script --show-bpf-events ... swapper 0 [000] 0.000000: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0ef971d len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 swapper 0 [000] 0.000000: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 36 ...Signed-off-by Jiri Olsa <[email protected]>---
tools/perf/Documentation/perf-script.txt| 3 ++tools/perf/builtin-script.c| 42 ++++++++++++++++++++++++2 files changed, 45 insertions(+)tools/perf/Documentation/perf-script.txt +3
-2@@ -313,6 +313,9 @@ OPTIONS --show-round-events Display finished round events i.e. events of type PERF_RECORD_FINISHED_ROUND. +--show-bpf-events + Display bpf events i.e. events of type PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT. + --demangle:: Demangle symbol names to human readable form. It's enabled by default, disable with --no-demangle.tools/perf/builtin-script.c +36
-0@@ -1606,6 +1606,7 @@ struct perf_script {bool show_namespace_events;bool show_lost_events;bool show_round_events; +bool show_bpf_events;bool allocated;bool per_event_dump;struct cpu_map *cpus;@@ -2318,6 +2319,41 @@ process_finished_round_event(struct perf_tool *tool __maybe_unused,return 0 ; } +static int +process_bpf_events (struct perf_tool *tool__maybe_unused , +union perf_event *event, +struct perf_sample *sample, +struct machine *machine) +{ +struct thread *thread; + struct perf_script *script = container_of(tool, struct perf_script, tool); +struct perf_session *session = script->session; +struct perf_evsel *evsel =perf_evlist__id2evsel (session->evlist, sample->id); + +if (machine__process_ksymbol (machine, event, sample) <0 ) +return -1 ; + +if (!evsel->attr.sample_id_all) { +perf_event__fprintf (event, stdout); +return 0 ; + } + + thread =machine__findnew_thread (machine, sample->pid, sample->tid); +if (thread ==NULL ) { +pr_debug ("problem processing MMAP event, skipping it.\n" ); +return -1 ; + } + +if (!filter_cpu (sample)) { +perf_sample__fprintf_start (sample, thread, evsel, + event->header.type, stdout); +perf_event__fprintf (event, stdout); + } + +thread__put (thread); +return 0 ; +} +static void sig_handler (int sig__maybe_unused ) { session_done =1 ;
tools/perf/builtin-script.c static int __cmd_script(struct perf_script *script) · line 2461
Quoted 6 lines
tools/perf/builtin-script.c +3
-0@@ -2420,6 +2456,10 @@ static int __cmd_script(struct perf_script *script) script->tool.ordered_events = false; script->tool.finished_round = process_finished_round_event; } +if (script->show_bpf_events) { + script->tool.ksymbol = process_bpf_events; + script->tool.bpf_event = process_bpf_events;
Why do we need both set to process_bpf_events?
Thanks,
Song
Quoted 16 lines
tools/perf/builtin-script.c +3
-0+ }if (perf_script__setup_per_event_dump (script)) {pr_err ("Couldn't create the per event dump files\n" );@@ -3439,6 +3479,8 @@ int cmd_script(int argc, const char **argv) "Show lost events (if recorded)"),OPT_BOOLEAN ('\0' ,"show-round-events" , &script.show_round_events,"Show round events (if recorded)" ), +OPT_BOOLEAN ('\0' ,"show-bpf-events" , &script.show_bpf_events, +"Show bpf related events (if recorded)" ),OPT_BOOLEAN ('\0' ,"per-event-dump" , &script.per_event_dump,"Dump trace output to files named by the monitored events" ), OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),Signature · 1 line
2.20.1
Re: [PATCH 10/12] perf script: Add --show-bpf-events to show eBPF related events
On Mon, May 06, 2019 at 09:42:44PM +0000, Song Liu wrote:
SNIP
Quoted 39 lines
Quoted 39 lines
tools/perf/builtin-script.c +35
-0+static int +process_bpf_events (struct perf_tool *tool__maybe_unused , +union perf_event *event, +struct perf_sample *sample, +struct machine *machine) +{ +struct thread *thread; + struct perf_script *script = container_of(tool, struct perf_script, tool); +struct perf_session *session = script->session; +struct perf_evsel *evsel =perf_evlist__id2evsel (session->evlist, sample->id); + +if (machine__process_ksymbol (machine, event, sample) <0 ) +return -1 ; + +if (!evsel->attr.sample_id_all) { +perf_event__fprintf (event, stdout); +return 0 ; + } + + thread =machine__findnew_thread (machine, sample->pid, sample->tid); +if (thread ==NULL ) { +pr_debug ("problem processing MMAP event, skipping it.\n" ); +return -1 ; + } + +if (!filter_cpu (sample)) { +perf_sample__fprintf_start (sample, thread, evsel, + event->header.type, stdout); +perf_event__fprintf (event, stdout); + } + +thread__put (thread); +return 0 ; +} +static void
sig_handler(int sig __maybe_unused){ session_done = 1;(quoted diff) +0
-0@@ -2420,6 +2456,10 @@ static int __cmd_script(struct perf_script *script)
Quoted 8 lines
tools/perf/builtin-script.c static int __cmd_script(struct perf_script *script) · line 2461
Quoted 6 lines
tools/perf/builtin-script.c +3
-0script->tool.ordered_events = false; script->tool.finished_round = process_finished_round_event; } +if (script->show_bpf_events) { + script->tool.ksymbol = process_bpf_events; + script->tool.bpf_event = process_bpf_events;Why do we need both set to
process_bpf_events?
--show-*-events option is there to display all the related events for given '*'
we want to display both ksymbol and bpf_event in here, process_bpf_events takes care of it for both of them
thanks,
jirka
Re: [PATCH 10/12] perf script: Add --show-bpf-events to show eBPF related events
Quoted 56 lines · Jiri Olsa
On Mon, May 06, 2019 at 09:42:44PM +0000, Song Liu wrote:
SNIP
Quoted 39 lines
Quoted 39 lines
tools/perf/builtin-script.c +35
-0+static int +process_bpf_events (struct perf_tool *tool__maybe_unused , +union perf_event *event, +struct perf_sample *sample, +struct machine *machine) +{ +struct thread *thread; + struct perf_script *script = container_of(tool, struct perf_script, tool); +struct perf_session *session = script->session; +struct perf_evsel *evsel =perf_evlist__id2evsel (session->evlist, sample->id); + +if (machine__process_ksymbol (machine, event, sample) <0 ) +return -1 ; + +if (!evsel->attr.sample_id_all) { +perf_event__fprintf (event, stdout); +return 0 ; + } + + thread =machine__findnew_thread (machine, sample->pid, sample->tid); +if (thread ==NULL ) { +pr_debug ("problem processing MMAP event, skipping it.\n" ); +return -1 ; + } + +if (!filter_cpu (sample)) { +perf_sample__fprintf_start (sample, thread, evsel, + event->header.type, stdout); +perf_event__fprintf (event, stdout); + } + +thread__put (thread); +return 0 ; +} +static void
sig_handler(int sig __maybe_unused){ session_done = 1;(quoted diff) +0
-0@@ -2420,6 +2456,10 @@ static int __cmd_script(struct perf_script *script)Quoted 8 lines
tools/perf/builtin-script.c static int __cmd_script(struct perf_script *script) · line 2461
Quoted 6 lines
tools/perf/builtin-script.c +3
-0script->tool.ordered_events = false; script->tool.finished_round = process_finished_round_event; } +if (script->show_bpf_events) { + script->tool.ksymbol = process_bpf_events; + script->tool.bpf_event = process_bpf_events;Why do we need both set to
process_bpf_events?
Quoted 4 lines
--show-*-events option is there to display all the related events for given '*'
we want to display both ksymbol and
bpf_eventin here,process_bpf_eventstakes care of it for both of them
I see. Thanks for the explanation!
Song
Jiri Olsa
reviewerPATCH v2 11/12 perf script: Remove superfluous bpf event titles
In reply to Jiri OlsaThere's no need to display "ksymbol event with" text for PERF_RECORD_KSYMBOL event and "bpf event with" test for PERF_RECORD_BPF_EVENT event.
Removing it so it also goes along with other side-band events display.
Before:
# perf script --show-bpf-events ... swapper 0 [000] 0.000000: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0ef971d len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 swapper 0 [000] 0.000000: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 36
After:
# perf script --show-bpf-events ... swapper 0 [000] 0.000000: PERF_RECORD_KSYMBOL addr ffffffffc0ef971d len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 swapper 0 [000] 0.000000: PERF_RECORD_BPF_EVENT type 1, flags 0, id 36
--- tools/perf/util/event.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/event.c +2 -2
@@ -1485,7 +1485,7 @@ static size_t perf_event__fprintf_lost(union perf_event *event, FILE *fp)size_t perf_event__fprintf_ksymbol (union perf_event *event,FILE *fp) { -return fprintf (fp," ksymbol event with addr %" PRIx64" len %u type %u flags 0x%x name %s\n" , +return fprintf (fp," addr %" PRIx64" len %u type %u flags 0x%x name %s\n" , event->ksymbol_event.addr, event->ksymbol_event.len, event->ksymbol_event.ksym_type, event->ksymbol_event.flags, event->ksymbol_event.name);
@@ -1493,7 +1493,7 @@ size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp)size_t perf_event__fprintf_bpf_event (union perf_event *event,FILE *fp) { -return fprintf (fp," bpf event with type %u, flags %u, id %u\n" , +return fprintf (fp," type %u, flags %u, id %u\n" , event->bpf_event.type, event->bpf_event.flags, event->bpf_event.id); }
Signature · 1 line
2.20.1
Jiri Olsa
reviewerPATCH v2 12/12 perf script: Add --show-all-events option
In reply to Jiri OlsaAdding --show-all-events option to show all
side-bad events with single option, like:
$ perf script --show-all-events swapper 0 [000] 0.000000: PERF_RECORD_MMAP -1/0: [0xffffffffa6000000(0xc00e41) @ 0xffffffffa6000000]: x [kernel.kallsyms]_text ... swapper 0 [000] 0.000000: PERF_RECORD_KSYMBOL addr ffffffffc01bc362 len 229 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba swapper 0 [000] 0.000000: PERF_RECORD_BPF_EVENT type 1, flags 0, id 29 ... swapper 0 [000] 0.000000: PERF_RECORD_FORK(1:1):(0:0) systemd 0 [000] 0.000000: PERF_RECORD_COMM: systemd:1/1 ... swapper 0 [000] 63587.039518: 1 cycles: ffffffffa60698b4 [unknown] ([kernel.kallsyms]) swapper 0 [000] 63587.039522: 1 cycles: ffffffffa60698b4 [unknown] ([kernel.kallsyms])
--- tools/perf/Documentation/perf-script.txt | 3 +++ tools/perf/builtin-script.c | 13 +++++++++++++ 2 files changed, 16 insertions(+)
tools/perf/Documentation/perf-script.txt +3 -0
@@ -316,6 +316,9 @@ OPTIONS --show-bpf-events Display bpf events i.e. events of type PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT. +--show-all-events + Display all side-band events i.e. enable all --show-*-events options. + --demangle:: Demangle symbol names to human readable form. It's enabled by default, disable with --no-demangle.
tools/perf/builtin-script.c +13 -0
@@ -1607,6 +1607,7 @@ struct perf_script {bool show_lost_events;bool show_round_events;bool show_bpf_events; +bool show_all_events;bool allocated;bool per_event_dump;struct cpu_map *cpus;
@@ -2436,6 +2437,16 @@ static int __cmd_script(struct perf_script *script)perf_stat__init_shadow_stats (); +if (script->show_all_events) { + script->show_task_events = true; + script->show_mmap_events = true; + script->show_switch_events = true; + script->show_namespace_events = true; + script->show_lost_events = true; + script->show_round_events = true; + script->show_bpf_events = true; + } +/* override event processing functions */ if (script->show_task_events) { script->tool.comm = process_comm_event;
@@ -3481,6 +3492,8 @@ int cmd_script(int argc, const char **argv) "Show round events (if recorded)"),OPT_BOOLEAN ('\0' ,"show-bpf-events" , &script.show_bpf_events,"Show bpf related events (if recorded)" ), +OPT_BOOLEAN ('\0' ,"show-all-events" , &script.show_all_events, +"Show all side-band events (if recorded)" ),OPT_BOOLEAN ('\0' ,"per-event-dump" , &script.per_event_dump,"Dump trace output to files named by the monitored events" ), OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),
Signature · 1 line
2.20.1
Quoted 90 lines · Jiri Olsa
hi,
this patchset adds dso support to read and display bpf code inintel_pttrace output. I had to change some of the kernel maps processing code, so hopefully I did not break too many things ;-)It's now possible to see bpf code flow via:
# perf-with-kcore record pt -e intel_pt//ku -- sleep 1 # perf-with-kcore script pt --insn-trace --xed ... sleep 36660 [016] 1057036.806464404: ffffffff811dfba5 trace_call_bpf+0x65 ([kernel.kallsyms]) nopl %eax, (%rax,%rax,1) sleep 36660 [016] 1057036.806464404: ffffffff811dfbaa trace_call_bpf+0x6a ([kernel.kallsyms]) movq 0x30(%rbx), %rax sleep 36660 [016] 1057036.806464404: ffffffff811dfbae trace_call_bpf+0x6e ([kernel.kallsyms]) leaq 0x38(%rbx), %rsi sleep 36660 [016] 1057036.806464404: ffffffff811dfbb2 trace_call_bpf+0x72 ([kernel.kallsyms]) mov %r13, %rdi sleep 36660 [016] 1057036.806464404: ffffffff811dfbb5 trace_call_bpf+0x75 ([kernel.kallsyms]) callq 0xffffffff81c00c30 sleep 36660 [016] 1057036.806464404: ffffffff81c00c30 __x86_indirect_thunk_rax+0x0 ([kernel.kallsyms]) callq 0xffffffff81c00c3c sleep 36660 [016] 1057036.806464404: ffffffff81c00c3c __x86_indirect_thunk_rax+0xc ([kernel.kallsyms]) movq %rax, (%rsp) sleep 36660 [016] 1057036.806464404: ffffffff81c00c40 __x86_indirect_thunk_rax+0x10 ([kernel.kallsyms]) retq sleep 36660 [016] 1057036.806464725: ffffffffa05e89ef bpf_prog_da4fe6b3d2c29b25_trace_return+0x0 (bpf_prog_da4fe6b3d2c29b25_trace_return) pushq %rbp sleep 36660 [016] 1057036.806464725: ffffffffa05e89f0 bpf_prog_da4fe6b3d2c29b25_trace_return+0x1 (bpf_prog_da4fe6b3d2c29b25_trace_return) mov %rsp, %rbp sleep 36660 [016] 1057036.806464725: ffffffffa05e89f3 bpf_prog_da4fe6b3d2c29b25_trace_return+0x4 (bpf_prog_da4fe6b3d2c29b25_trace_return) sub $0x158, %rsp sleep 36660 [016] 1057036.806464725: ffffffffa05e89fa bpf_prog_da4fe6b3d2c29b25_trace_return+0xb (bpf_prog_da4fe6b3d2c29b25_trace_return) sub $0x28, %rbp sleep 36660 [016] 1057036.806464725: ffffffffa05e89fe bpf_prog_da4fe6b3d2c29b25_trace_return+0xf (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rbx, (%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a02 bpf_prog_da4fe6b3d2c29b25_trace_return+0x13 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r13, 0x8(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a06 bpf_prog_da4fe6b3d2c29b25_trace_return+0x17 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r14, 0x10(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a0a bpf_prog_da4fe6b3d2c29b25_trace_return+0x1b (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %r15, 0x18(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a0e bpf_prog_da4fe6b3d2c29b25_trace_return+0x1f (bpf_prog_da4fe6b3d2c29b25_trace_return) xor %eax, %eax sleep 36660 [016] 1057036.806464725: ffffffffa05e8a10 bpf_prog_da4fe6b3d2c29b25_trace_return+0x21 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rax, 0x20(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a14 bpf_prog_da4fe6b3d2c29b25_trace_return+0x25 (bpf_prog_da4fe6b3d2c29b25_trace_return) mov %rdi, %rbx sleep 36660 [016] 1057036.806464725: ffffffffa05e8a17 bpf_prog_da4fe6b3d2c29b25_trace_return+0x28 (bpf_prog_da4fe6b3d2c29b25_trace_return) callq 0xffffffff811fed50 sleep 36660 [016] 1057036.806464725: ffffffff811fed50 bpf_get_current_pid_tgid+0x0 ([kernel.kallsyms]) nopl %eax, (%rax,%rax,1) sleep 36660 [016] 1057036.806464725: ffffffff811fed55 bpf_get_current_pid_tgid+0x5 ([kernel.kallsyms]) movq %gs:0x15c00, %rdx sleep 36660 [016] 1057036.806464725: ffffffff811fed5e bpf_get_current_pid_tgid+0xe ([kernel.kallsyms]) test %rdx, %rdx sleep 36660 [016] 1057036.806464725: ffffffff811fed61 bpf_get_current_pid_tgid+0x11 ([kernel.kallsyms]) jz 0xffffffff811fed79 sleep 36660 [016] 1057036.806464725: ffffffff811fed63 bpf_get_current_pid_tgid+0x13 ([kernel.kallsyms]) movsxdl 0x494(%rdx), %rax sleep 36660 [016] 1057036.806464725: ffffffff811fed6a bpf_get_current_pid_tgid+0x1a ([kernel.kallsyms]) movsxdl 0x490(%rdx), %rdx sleep 36660 [016] 1057036.806464725: ffffffff811fed71 bpf_get_current_pid_tgid+0x21 ([kernel.kallsyms]) shl $0x20, %rax sleep 36660 [016] 1057036.806464725: ffffffff811fed75 bpf_get_current_pid_tgid+0x25 ([kernel.kallsyms]) or %rdx, %rax sleep 36660 [016] 1057036.806464725: ffffffff811fed78 bpf_get_current_pid_tgid+0x28 ([kernel.kallsyms]) retq sleep 36660 [016] 1057036.806464725: ffffffffa05e8a1c bpf_prog_da4fe6b3d2c29b25_trace_return+0x2d (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rax, -0x8(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a20 bpf_prog_da4fe6b3d2c29b25_trace_return+0x31 (bpf_prog_da4fe6b3d2c29b25_trace_return) xor %edi, %edi sleep 36660 [016] 1057036.806464725: ffffffffa05e8a22 bpf_prog_da4fe6b3d2c29b25_trace_return+0x33 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rdi, -0x10(%rbp) sleep 36660 [016] 1057036.806464725: ffffffffa05e8a26 bpf_prog_da4fe6b3d2c29b25_trace_return+0x37 (bpf_prog_da4fe6b3d2c29b25_trace_return) movq %rdi, -0x18(%rbp)# perf-core/perf-with-kcore script pt --call-trace ... sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) kretprobe_perf_func sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) trace_call_bpf sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464404: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_pid_tgid sleep 36660 [016] 1057036.806464725: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_ktime_get_ns sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806464725: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806465045: (bpf_prog_da4fe6b3d2c29b25_trace_return ) __htab_map_lookup_elem sleep 36660 [016] 1057036.806465366: ([kernel.kallsyms] ) memcmp sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806465687: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_probe_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) probe_kernel_read sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) __check_object_size sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) check_stack_object sleep 36660 [016] 1057036.806465687: ([kernel.kallsyms] ) copy_user_enhanced_fast_string sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_get_current_uid_gid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kgid sleep 36660 [016] 1057036.806466008: ([kernel.kallsyms] ) from_kuid sleep 36660 [016] 1057036.806466008: (bpf_prog_da4fe6b3d2c29b25_trace_return ) bpf_perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_event_output sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_prepare_sample sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) perf_misc_flags sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_rax sleep 36660 [016] 1057036.806466328: ([kernel.kallsyms] ) __x86_indirect_thunk_raxv2 changes:
- fix missingpthread_mutex_unlock[Stanislav Fomichev]
- removed eBPF dso reusing [Adrian Hunter]
- merge eBPF and kcore maps [Adrian Hunter]
- few patches already applied
- added some perf script helper options
- patches are rebased on top of Arnaldo's perf/core with perf/urgent merged in
Quoted 6 lines
It's also available in here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/fixesthanks,
jirka
Besides minor comments in a few patches, for the series:
Quoted 36 lines
Cc Jesper Dangaard Brouer <[email protected]>Cc Alexei Starovoitov <[email protected]>Cc Daniel Borkmann <[email protected]>---
Jiri Olsa (12):
perf tools: Separate generic code indso__data_file_sizeperf tools: Separate generic code indso_cache__readperf tools: Simplifydso_cache__readfunction
perf tools: Add bpf dso read and size hooks
perf tools: Read also the end of the kernel
perf tools: Keep zero in pgoff bpf map
perf script: Pad dso name for --call-trace
perf tools: Preserve eBPF maps when loading kcore perf tests: Addmap_groups__merge_intest
perf script: Add --show-bpf-events to show eBPF related events perf script: Remove superfluous bpf event titles perf script: Add --show-all-events optiontools/include/linux/kernel.h | 1 + tools/lib/vsprintf.c | 19 +++++++++++++++++++ tools/perf/Documentation/perf-script.txt | 6 ++++++ tools/perf/builtin-script.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 4 ++++ tools/perf/tests/map_groups.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/util/dso.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ tools/perf/util/event.c | 4 ++-- tools/perf/util/machine.c | 31 ++++++++++++++++++++----------- tools/perf/util/map.c | 6 ++++++ tools/perf/util/map_groups.h | 2 ++ tools/perf/util/symbol.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- tools/perf/util/symbol_conf.h | 1 + 15 files changed, 421 insertions(+), 53 deletions(-)create mode 100644
tools/perf/tests/map_groups.c