diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-06-03 10:39:26 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-06-03 10:39:26 +0200 |
commit | ed966aac335a63083d3125198479447248637d9e (patch) | |
tree | 7de805123f69cd4f97bc3e91c93fca9db610eab8 /Documentation/perf_counter/builtin-report.c | |
parent | 5352f35d6ae7b8b981d77137fb268bc54d10624f (diff) | |
download | lwn-ed966aac335a63083d3125198479447248637d9e.tar.gz lwn-ed966aac335a63083d3125198479447248637d9e.zip |
perf report: Handle vDSO symbols properly
We were not looking up vDSO symbols properly, because they
are in the kallsyms but are user-mode entries.
Pass negative addresses to the kernel dso object, this
way we resolve them properly:
0.05% [kernel]: vread_tsc
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: John Kacur <jkacur@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'Documentation/perf_counter/builtin-report.c')
-rw-r--r-- | Documentation/perf_counter/builtin-report.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/Documentation/perf_counter/builtin-report.c b/Documentation/perf_counter/builtin-report.c index a8d390596d8d..0f88d9ebb34a 100644 --- a/Documentation/perf_counter/builtin-report.c +++ b/Documentation/perf_counter/builtin-report.c @@ -728,6 +728,8 @@ more: event->ip.pid, (void *)(long)ip); + dprintf(" ... thread: %s:%d\n", thread->comm, thread->pid); + if (thread == NULL) { fprintf(stderr, "problem processing %d event, skipping it.\n", event->header.type); @@ -740,6 +742,8 @@ more: dso = kernel_dso; + dprintf(" ...... dso: %s\n", dso->name); + } else if (event->header.misc & PERF_EVENT_MISC_USER) { show = SHOW_USER; @@ -749,11 +753,22 @@ more: if (map != NULL) { dso = map->dso; ip -= map->start + map->pgoff; + } else { + /* + * If this is outside of all known maps, + * and is a negative address, try to look it + * up in the kernel dso, as it might be a + * vsyscall (which executes in user-mode): + */ + if ((long long)ip < 0) + dso = kernel_dso; } + dprintf(" ...... dso: %s\n", dso ? dso->name : "<not found>"); } else { show = SHOW_HV; level = 'H'; + dprintf(" ...... dso: [hypervisor]\n"); } if (show & show_mask) { |