lkml.org 
[lkml]   [2022]   [Sep]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4] perf tools: Add 'addr' sort key
    Date
    Sometimes users want to see actual (virtual) address of sampled instructions.
    Add a new 'addr' sort key to display the raw addresses.

    $ perf record -o- true | perf report -i- -s addr
    # To display the perf.data header info, please use --header/--header-only options.
    #
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.000 MB - ]
    #
    # Total Lost Samples: 0
    #
    # Samples: 12 of event 'cycles:u'
    # Event count (approx.): 252512
    #
    # Overhead Address
    # ........ ..................
    #
    42.96% 0x7f96f08443d7
    29.55% 0x7f96f0859b50
    14.76% 0x7f96f0852e02
    8.30% 0x7f96f0855028
    4.43% 0xffffffff8de01087

    Note that it just compares and displays the sample ip. Each process can
    have a different memory layout and the ip will be different even if they run
    the same binary. So this sort key is mostly meaningful for per-process
    profile data.

    Cc: Stephane Eranian <eranian@google.com>
    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/Documentation/perf-report.txt | 3 +-
    tools/perf/util/hist.c | 1 +
    tools/perf/util/hist.h | 1 +
    tools/perf/util/sort.c | 38 ++++++++++++++++++++++++
    tools/perf/util/sort.h | 1 +
    5 files changed, 43 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
    index 24efc0583c93..4533db2ee56b 100644
    --- a/tools/perf/Documentation/perf-report.txt
    +++ b/tools/perf/Documentation/perf-report.txt
    @@ -73,7 +73,7 @@ OPTIONS
    Sort histogram entries by given key(s) - multiple keys can be specified
    in CSV format. Following sort keys are available:
    pid, comm, dso, symbol, parent, cpu, socket, srcline, weight,
    - local_weight, cgroup_id.
    + local_weight, cgroup_id, addr.

    Each key has following meaning:

    @@ -114,6 +114,7 @@ OPTIONS
    - local_ins_lat: Local instruction latency version
    - p_stage_cyc: On powerpc, this presents the number of cycles spent in a
    pipeline stage. And currently supported only on powerpc.
    + - addr: (Full) virtual address of the sampled instruction

    By default, comm, dso and symbol keys are used.
    (i.e. --sort comm,dso,symbol)
    diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
    index 06f5dbf213ad..17a05e943b44 100644
    --- a/tools/perf/util/hist.c
    +++ b/tools/perf/util/hist.c
    @@ -215,6 +215,7 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
    hists__new_col_len(hists, HISTC_GLOBAL_INS_LAT, 13);
    hists__new_col_len(hists, HISTC_LOCAL_P_STAGE_CYC, 13);
    hists__new_col_len(hists, HISTC_GLOBAL_P_STAGE_CYC, 13);
    + hists__new_col_len(hists, HISTC_ADDR, BITS_PER_LONG / 4 + 2);

    if (symbol_conf.nanosecs)
    hists__new_col_len(hists, HISTC_TIME, 16);
    diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
    index c7a7a3fa0b87..ebd8a8f783ee 100644
    --- a/tools/perf/util/hist.h
    +++ b/tools/perf/util/hist.h
    @@ -79,6 +79,7 @@ enum hist_column {
    HISTC_GLOBAL_P_STAGE_CYC,
    HISTC_ADDR_FROM,
    HISTC_ADDR_TO,
    + HISTC_ADDR,
    HISTC_NR_COLS, /* Last entry */
    };

    diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
    index 6d5588e80935..2e7330867e2e 100644
    --- a/tools/perf/util/sort.c
    +++ b/tools/perf/util/sort.c
    @@ -1948,6 +1948,43 @@ struct sort_entry sort_dso_size = {
    .se_width_idx = HISTC_DSO_SIZE,
    };

    +/* --sort dso_size */
    +
    +static int64_t
    +sort__addr_cmp(struct hist_entry *left, struct hist_entry *right)
    +{
    + u64 left_ip = left->ip;
    + u64 right_ip = right->ip;
    + struct map *left_map = left->ms.map;
    + struct map *right_map = right->ms.map;
    +
    + if (left_map)
    + left_ip = left_map->unmap_ip(left_map, left_ip);
    + if (right_map)
    + right_ip = right_map->unmap_ip(right_map, right_ip);
    +
    + return _sort__addr_cmp(left_ip, right_ip);
    +}
    +
    +static int hist_entry__addr_snprintf(struct hist_entry *he, char *bf,
    + size_t size, unsigned int width)
    +{
    + u64 ip = he->ip;
    + struct map *map = he->ms.map;
    +
    + if (map)
    + ip = map->unmap_ip(map, ip);
    +
    + return repsep_snprintf(bf, size, "%-#*llx", width, ip);
    +}
    +
    +struct sort_entry sort_addr = {
    + .se_header = "Address",
    + .se_cmp = sort__addr_cmp,
    + .se_snprintf = hist_entry__addr_snprintf,
    + .se_width_idx = HISTC_ADDR,
    +};
    +

    struct sort_dimension {
    const char *name;
    @@ -1997,6 +2034,7 @@ static struct sort_dimension common_sort_dimensions[] = {
    DIM(SORT_GLOBAL_INS_LAT, "ins_lat", sort_global_ins_lat),
    DIM(SORT_LOCAL_PIPELINE_STAGE_CYC, "local_p_stage_cyc", sort_local_p_stage_cyc),
    DIM(SORT_GLOBAL_PIPELINE_STAGE_CYC, "p_stage_cyc", sort_global_p_stage_cyc),
    + DIM(SORT_ADDR, "addr", sort_addr),
    };

    #undef DIM
    diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
    index af14eb46c2b6..04ff8b61a2a7 100644
    --- a/tools/perf/util/sort.h
    +++ b/tools/perf/util/sort.h
    @@ -236,6 +236,7 @@ enum sort_type {
    SORT_GLOBAL_INS_LAT,
    SORT_LOCAL_PIPELINE_STAGE_CYC,
    SORT_GLOBAL_PIPELINE_STAGE_CYC,
    + SORT_ADDR,

    /* branch stack specific sort keys */
    __SORT_BRANCH_STACK,
    --
    2.37.3.998.g577e59143f-goog
    \
     
     \ /
      Last update: 2022-09-23 19:33    [W:2.624 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site