lkml.org 
[lkml]   [2014]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/27] perf tools: Update cpumode for each cumulative entry
    Date
    The cpumode and level in struct addr_localtion was set for a sample
    and but updated as cumulative callchains were added. This led to have
    non-matching symbol and cpumode in the output.

    Update it accordingly based on the fact whether the map is a part of
    the kernel or not. This is a reverse of what thread__find_addr_map()
    does.

    Tested-by: Arun Sharma <asharma@fb.com>
    Tested-by: Rodrigo Campos <rodrigo@sdfg.com.ar>
    Acked-by: Jiri Olsa <jolsa@redhat.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/util/callchain.c | 42 ++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/callchain.h | 2 ++
    tools/perf/util/hist.c | 13 ++-----------
    3 files changed, 46 insertions(+), 11 deletions(-)

    diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
    index 2af69c47b725..48b6d3f50012 100644
    --- a/tools/perf/util/callchain.c
    +++ b/tools/perf/util/callchain.c
    @@ -630,3 +630,45 @@ int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *samp
    return 0;
    return callchain_append(he->callchain, &callchain_cursor, sample->period);
    }
    +
    +int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node,
    + bool hide_unresolved)
    +{
    + al->map = node->map;
    + al->sym = node->sym;
    + if (node->map)
    + al->addr = node->map->map_ip(node->map, node->ip);
    + else
    + al->addr = node->ip;
    +
    + if (al->sym == NULL) {
    + if (hide_unresolved)
    + return 0;
    + if (al->map == NULL)
    + goto out;
    + }
    +
    + if (al->map->groups == &al->machine->kmaps) {
    + if (machine__is_host(al->machine)) {
    + al->cpumode = PERF_RECORD_MISC_KERNEL;
    + al->level = 'k';
    + } else {
    + al->cpumode = PERF_RECORD_MISC_GUEST_KERNEL;
    + al->level = 'g';
    + }
    + } else {
    + if (machine__is_host(al->machine)) {
    + al->cpumode = PERF_RECORD_MISC_USER;
    + al->level = '.';
    + } else if (perf_guest) {
    + al->cpumode = PERF_RECORD_MISC_GUEST_USER;
    + al->level = 'u';
    + } else {
    + al->cpumode = PERF_RECORD_MISC_HYPERVISOR;
    + al->level = 'H';
    + }
    + }
    +
    +out:
    + return 1;
    +}
    diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
    index bde2b0cc24cf..24a53d562d0a 100644
    --- a/tools/perf/util/callchain.h
    +++ b/tools/perf/util/callchain.h
    @@ -162,6 +162,8 @@ int sample__resolve_callchain(struct perf_sample *sample, struct symbol **parent
    struct perf_evsel *evsel, struct addr_location *al,
    int max_stack);
    int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample);
    +int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node,
    + bool hide_unresolved);

    extern const char record_callchain_help[];
    int parse_callchain_report_opt(const char *arg);
    diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
    index 6079b5acfb6d..37c28fc13dc3 100644
    --- a/tools/perf/util/hist.c
    +++ b/tools/perf/util/hist.c
    @@ -743,18 +743,9 @@ iter_next_cumulative_entry(struct hist_entry_iter *iter,
    if (node == NULL)
    return 0;

    - al->map = node->map;
    - al->sym = node->sym;
    - if (node->map)
    - al->addr = node->map->map_ip(node->map, node->ip);
    - else
    - al->addr = node->ip;
    -
    - if (iter->hide_unresolved && al->sym == NULL)
    - return 0;
    -
    callchain_cursor_advance(&callchain_cursor);
    - return 1;
    +
    + return fill_callchain_info(al, node, iter->hide_unresolved);
    }

    static int
    --
    1.9.2


    \
     
     \ /
      Last update: 2014-05-29 07:01    [W:4.234 / U:0.408 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site