• Namhyung Kim's avatar
    perf annotate: Honor output options with --data-type · bdeaf6ff
    Namhyung Kim authored
    For data type profiling output, it should be in sync with normal output
    so make it display percentage for each field.  Also use coloring scheme
    for users to identify fields with big overhead easily.
    
    Users can use --show-total-period or --show-nr-samples to change the
    output style like in the normal perf annotate output.
    
    Before:
    
      $ perf annotate --data-type
      Annotate type: 'struct task_struct' in [kernel.kallsyms] (34 samples):
      ============================================================================
          samples     offset       size  field
               34          0       9792  struct task_struct    {
                2          0         24      struct thread_info       thread_info {
                0          0          8          long unsigned int    flags;
                1          8          8          long unsigned int    syscall_work;
                0         16          4          u32  status;
                1         20          4          u32  cpu;
                                             };
    
    After:
    
      $ perf annotate --data-type
      Annotate type: 'struct task_struct' in [kernel.kallsyms] (34 samples):
      ============================================================================
       Percent     offset       size  field
        100.00          0       9792  struct task_struct       {
          3.55          0         24      struct thread_info  thread_info {
          0.00          0          8          long unsigned int       flags;
          1.63          8          8          long unsigned int       syscall_work;
          0.00         16          4          u32     status;
          1.91         20          4          u32     cpu;
                                          };
    
    Committer testing:
    
    First collect a suitable perf.data file for use with 'perf annotate --data-type':
    
      root@number:~# perf mem record -a sleep 1s
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 11.047 MB perf.data (3466 samples) ]
      root@number:~#
    
    Then, before:
    
      root@number:~# perf annotate --data-type
      Annotate type: 'union ' in /usr/lib64/libc.so.6 (6 samples):
      ============================================================================
          samples     offset       size  field
                6          0         40  union         {
                6          0         40      struct __pthread_mutex_s __data {
                2          0          4          int  __lock;
                0          4          4          unsigned int __count;
                0          8          4          int  __owner;
                1         12          4          unsigned int __nusers;
                2         16          4          int  __kind;
                1         20          2          short int    __spins;
                0         22          2          short int    __elision;
                0         24         16          __pthread_list_t     __list {
                0         24          8              struct __pthread_internal_list*  __prev;
                0         32          8              struct __pthread_internal_list*  __next;
                                                 };
                                             };
                0          0          0      char*    __size;
                2          0          8      long int __align;
                                         };
      <SNIP>
    
    And after:
    
      Annotate type: 'union ' in /usr/lib64/libc.so.6 (6 samples):
      ============================================================================
       Percent     offset       size  field
        100.00          0         40  union    {
        100.00          0         40      struct __pthread_mutex_s    __data {
         31.27          0          4          int     __lock;
          0.00          4          4          unsigned int    __count;
          0.00          8          4          int     __owner;
          7.67         12          4          unsigned int    __nusers;
         53.10         16          4          int     __kind;
          7.96         20          2          short int       __spins;
          0.00         22          2          short int       __elision;
          0.00         24         16          __pthread_list_t        __list {
          0.00         24          8              struct __pthread_internal_list*     __prev;
          0.00         32          8              struct __pthread_internal_list*     __next;
                                              };
                                          };
          0.00          0          0      char*       __size;
         31.27          0          8      long int    __align;
                                      };
      <SNIP>
    
    The lines with percentages >= 7.67 have its percentages red colored.
    Reviewed-by: default avatarKan Liang <kan.liang@linux.intel.com>
    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: Peter Zijlstra <peterz@infradead.org>
    Link: https://lore.kernel.org/r/20240322224313.423181-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    bdeaf6ff
builtin-annotate.c 26.5 KB