]> git.itanic.dy.fi Git - linux-stable/commitdiff
perf report: Add 'symoff' sort key
authorNamhyung Kim <namhyung@kernel.org>
Wed, 13 Dec 2023 00:13:19 +0000 (16:13 -0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sun, 24 Dec 2023 01:39:42 +0000 (22:39 -0300)
The symoff sort key is to print symbol and offset of sample.  This is
useful for data type profiling to show exact instruction in the function
which refers the data.

  $ perf report -s type,sym,typeoff,symoff --hierarchy
  ...
  #       Overhead  Data Type / Symbol / Data Type Offset / Symbol Offset
  # ..............  .....................................................
  #
      1.23%         struct cfs_rq
        0.84%         update_blocked_averages
          0.19%         struct cfs_rq +336 (leaf_cfs_rq_list.next)
             0.19%         [k] update_blocked_averages+0x96
          0.19%         struct cfs_rq +0 (load.weight)
             0.14%         [k] update_blocked_averages+0x104
             0.04%         [k] update_blocked_averages+0x31c
          0.17%         struct cfs_rq +404 (throttle_count)
             0.12%         [k] update_blocked_averages+0x9d
             0.05%         [k] update_blocked_averages+0x1f9
          0.08%         struct cfs_rq +272 (propagate)
             0.07%         [k] update_blocked_averages+0x3d3
             0.02%         [k] update_blocked_averages+0x45b
  ...

Committer testing:

  # perf report --stdio -s type,typeoff,symoff
  # To display the perf.data header info, please use --header/--header-only options.
  #
  #
  # Total Lost Samples: 0
  #
  # Samples: 4  of event 'cpu_atom/mem-loads,ldlat=30/P'
  # Event count (approx.): 7
  #
  # Overhead  Data Type  Data Type Offset  Symbol Offset
  # ........  .........  ................  .............
  #
      42.86%  struct list_head  struct list_head +8 (prev)  [k] __list_del_entry_valid_or_report+0x7
      28.57%  (unknown)  (unknown) +0 (no field)  [.] _nl_intern_locale_data+0x25
      14.29%  char       char +0 (no field)  [k] strncpy_from_user+0xa5
      14.29%  (unknown)  (unknown) +0 (no field)  [.] _dl_lookup_symbol_x+0x50

  #
  # (Tip: To change sampling frequency to 100 Hz: perf record -F 100)
  #

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: linux-toolchains@vger.kernel.org
Cc: linux-trace-devel@vger.kernel.org
Link: https://lore.kernel.org/r/20231213001323.718046-14-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-report.txt
tools/perf/util/hist.h
tools/perf/util/sort.c
tools/perf/util/sort.h

index b57eb51b47aa642dad3f58af945d57e1e98baab6..38f59ac064f7d4615daf5e1bba57a7045ba4c597 100644 (file)
@@ -120,6 +120,7 @@ OPTIONS
        - simd: Flags describing a SIMD operation. "e" for empty Arm SVE predicate. "p" for partial Arm SVE predicate
        - type: Data type of sample memory access.
        - typeoff: Offset in the data type of sample memory access.
+       - symoff: Offset in the symbol.
 
        By default, comm, dso and symbol keys are used.
        (i.e. --sort comm,dso,symbol)
index 18128a49309efa6b8da72bc9e154a8f619657194..4a0aea0c9e00e09b64520df0948460493acb55b5 100644 (file)
@@ -84,6 +84,7 @@ enum hist_column {
        HISTC_SIMD,
        HISTC_TYPE,
        HISTC_TYPE_OFFSET,
+       HISTC_SYMBOL_OFFSET,
        HISTC_NR_COLS, /* Last entry */
 };
 
index d78e680d398809745d4a14dc43f965c839763e44..0cbbd5ba8175a4af9657436e8981847813b45ff3 100644 (file)
@@ -419,6 +419,52 @@ struct sort_entry sort_sym = {
        .se_width_idx   = HISTC_SYMBOL,
 };
 
+/* --sort symoff */
+
+static int64_t
+sort__symoff_cmp(struct hist_entry *left, struct hist_entry *right)
+{
+       int64_t ret;
+
+       ret = sort__sym_cmp(left, right);
+       if (ret)
+               return ret;
+
+       return left->ip - right->ip;
+}
+
+static int64_t
+sort__symoff_sort(struct hist_entry *left, struct hist_entry *right)
+{
+       int64_t ret;
+
+       ret = sort__sym_sort(left, right);
+       if (ret)
+               return ret;
+
+       return left->ip - right->ip;
+}
+
+static int
+hist_entry__symoff_snprintf(struct hist_entry *he, char *bf, size_t size, unsigned int width)
+{
+       struct symbol *sym = he->ms.sym;
+
+       if (sym == NULL)
+               return repsep_snprintf(bf, size, "[%c] %-#.*llx", he->level, width - 4, he->ip);
+
+       return repsep_snprintf(bf, size, "[%c] %s+0x%llx", he->level, sym->name, he->ip - sym->start);
+}
+
+struct sort_entry sort_sym_offset = {
+       .se_header      = "Symbol Offset",
+       .se_cmp         = sort__symoff_cmp,
+       .se_sort        = sort__symoff_sort,
+       .se_snprintf    = hist_entry__symoff_snprintf,
+       .se_filter      = hist_entry__sym_filter,
+       .se_width_idx   = HISTC_SYMBOL_OFFSET,
+};
+
 /* --sort srcline */
 
 char *hist_entry__srcline(struct hist_entry *he)
@@ -2335,6 +2381,7 @@ static struct sort_dimension common_sort_dimensions[] = {
        DIM(SORT_SIMD, "simd", sort_simd),
        DIM(SORT_ANNOTATE_DATA_TYPE, "type", sort_type),
        DIM(SORT_ANNOTATE_DATA_TYPE_OFFSET, "typeoff", sort_type_offset),
+       DIM(SORT_SYM_OFFSET, "symoff", sort_sym_offset),
 };
 
 #undef DIM
index d806adcc1e1eadc287e18cd526bcb78babaa0a54..6f6b4189a389780f8aabd0089f48ea28d759a37a 100644 (file)
@@ -249,6 +249,7 @@ enum sort_type {
        SORT_SIMD,
        SORT_ANNOTATE_DATA_TYPE,
        SORT_ANNOTATE_DATA_TYPE_OFFSET,
+       SORT_SYM_OFFSET,
 
        /* branch stack specific sort keys */
        __SORT_BRANCH_STACK,