lkml.org 
[lkml]   [2011]   [Sep]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/12] perf top: Fix userspace sample addr map offset
    Date
    From: Arnaldo Carvalho de Melo <acme@redhat.com>

    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>
    ---
    tools/perf/builtin-top.c | 9 +++++----
    1 files changed, 5 insertions(+), 4 deletions(-)

    diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
    index a43433f..d28013b 100644
    --- a/tools/perf/builtin-top.c
    +++ b/tools/perf/builtin-top.c
    @@ -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(&notes->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(&notes->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;
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2011-09-23 22:31    [W:0.022 / U:59.900 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site