mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
perf top: Fix userspace sample addr map offset
The 'perf top' tool came from the kernel where we had each DSO (vmlinux, modules) loaded just once at a time. But userspace may have DSOs loaded in multiple addresses (shared libraries), requiring that we use the just resolved map instead of the first one found. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-ag53wz0yllpgers0n2w7hchp@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
be96ea8ffa
commit
af52aafad2
1 changed files with 5 additions and 4 deletions
|
@ -191,7 +191,8 @@ static void __zero_source_counters(struct sym_entry *syme)
|
|||
symbol__annotate_zero_histograms(sym);
|
||||
}
|
||||
|
||||
static void record_precise_ip(struct sym_entry *syme, int counter, u64 ip)
|
||||
static void record_precise_ip(struct sym_entry *syme, struct map *map,
|
||||
int counter, u64 ip)
|
||||
{
|
||||
struct annotation *notes;
|
||||
struct symbol *sym;
|
||||
|
@ -205,8 +206,8 @@ static void record_precise_ip(struct sym_entry *syme, int counter, u64 ip)
|
|||
if (pthread_mutex_trylock(¬es->lock))
|
||||
return;
|
||||
|
||||
ip = syme->map->map_ip(syme->map, ip);
|
||||
symbol__inc_addr_samples(sym, syme->map, counter, ip);
|
||||
ip = map->map_ip(map, ip);
|
||||
symbol__inc_addr_samples(sym, map, counter, ip);
|
||||
|
||||
pthread_mutex_unlock(¬es->lock);
|
||||
}
|
||||
|
@ -810,7 +811,7 @@ static void perf_event__process_sample(const union perf_event *event,
|
|||
evsel = perf_evlist__id2evsel(top.evlist, sample->id);
|
||||
assert(evsel != NULL);
|
||||
syme->count[evsel->idx]++;
|
||||
record_precise_ip(syme, evsel->idx, ip);
|
||||
record_precise_ip(syme, al.map, evsel->idx, ip);
|
||||
pthread_mutex_lock(&top.active_symbols_lock);
|
||||
if (list_empty(&syme->node) || !syme->node.next) {
|
||||
static bool first = true;
|
||||
|
|
Loading…
Reference in a new issue