• Namhyung Kim's avatar
    perf annotate: Add --data-type option · 263925bf
    Namhyung Kim authored
    Support data type annotation with new --data-type option.  It internally
    uses type sort key to collect sample histogram for the type and display
    every members like below.
    
      $ perf annotate --data-type
      ...
      Annotate type: 'struct cfs_rq' in [kernel.kallsyms] (13 samples):
      ============================================================================
          samples     offset       size  field
               13          0        640  struct cfs_rq         {
                2          0         16      struct load_weight       load {
                2          0          8          unsigned long        weight;
                0          8          4          u32  inv_weight;
                                             };
                0         16          8      unsigned long    runnable_weight;
                0         24          4      unsigned int     nr_running;
                1         28          4      unsigned int     h_nr_running;
      ...
    
    For simplicity it prints the number of samples per field for now.
    But it should be easy to show the overhead percentage instead.
    
    The number at the outer struct is a sum of the numbers of the inner
    members.  For example, struct cfs_rq got total 13 samples, and 2 came
    from the load (struct load_weight) and 1 from h_nr_running.  Similarly,
    the struct load_weight got total 2 samples and they all came from the
    weight field.
    
    I've added two new flags in the symbol_conf for this.  The
    annotate_data_member is to get the members of the type.  This is also
    needed for perf report with typeoff sort key.  The annotate_data_sample
    is to update sample stats for each offset and used only in annotate.
    
    Currently it only support stdio output mode, TUI support can be added
    later.
    
    Committer testing:
    
    With the perf.data from the previous csets, a very simple, short
    duration one:
    
      # perf annotate --data-type
      Annotate type: 'struct list_head' in [kernel.kallsyms] (1 samples):
      ============================================================================
          samples     offset       size  field
                1          0         16  struct list_head      {
                0          0          8      struct list_head*        next;
                1          8          8      struct list_head*        prev;
                                         };
    
      Annotate type: 'char' in [kernel.kallsyms] (1 samples):
      ============================================================================
          samples     offset       size  field
                1          0          1  char ;
    
      #
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Tested-by: default avatarArnaldo 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-15-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    263925bf
annotate.c 90.5 KB