1. 08 Jan, 2024 1 commit
  2. 04 Jan, 2024 9 commits
  3. 03 Jan, 2024 6 commits
  4. 24 Dec, 2023 15 commits
    • Namhyung Kim's avatar
      perf annotate: Add --insn-stat option for debugging · 58824fa0
      Namhyung Kim authored
      This is for a debugging purpose.  It'd be useful to see per-instrucion
      level success/failure stats.
      
        $ perf annotate --data-type --insn-stat
        Annotate Instruction stats
        total 264, ok 143 (54.2%), bad 121 (45.8%)
      
          Name      :  Good   Bad
        -----------------------------------------------------------
          movq      :    45    31
          movl      :    22    11
          popq      :     0    19
          cmpl      :    16     3
          addq      :     8     7
          cmpq      :    11     3
          cmpxchgl  :     3     7
          cmpxchgq  :     8     0
          incl      :     3     3
          movzbl    :     4     2
          incq      :     4     2
          decl      :     6     0
          ...
      
      Committer notes:
      
      So these are about being able to find the type for accesses from these
      instructions, we should improve the naming, but it is for debugging, we
      can improve this later:
      
        @@ -3726,6 +3759,10 @@ struct annotated_data_type *hist_entry__get_data_type(struct hist_entry *he)
                                continue;
      
                        mem_type = find_data_type(ms, ip, op_loc->reg, op_loc->offset);
        +               if (mem_type)
        +                       istat->good++;
        +               else
        +                       istat->bad++;
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-18-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      58824fa0
    • Namhyung Kim's avatar
      perf annotate: Add --type-stat option for debugging · 61a9741e
      Namhyung Kim authored
      The --type-stat option is to be used with --data-type and to print
      detailed failure reasons for the data type annotation.
      
        $ perf annotate --data-type --type-stat
        Annotate data type stats:
        total 294, ok 116 (39.5%), bad 178 (60.5%)
        -----------------------------------------------------------
                30 : no_sym
                40 : no_insn_ops
                33 : no_mem_ops
                63 : no_var
                 4 : no_typeinfo
                 8 : bad_offset
      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-17-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      61a9741e
    • Namhyung Kim's avatar
      perf annotate: Support event group display · 227ad323
      Namhyung Kim authored
      When events are grouped together, it'd be natural to show them at once
      like in other mode.  Handle group leaders with members to collect the
      number of samples together and display like below:
      
        $ perf annotate --data-type --group
        ...
        Annotate type: 'struct page' in vmlinux (1 samples):
         event[0] = cpu/mem-loads,ldlat=30/P
         event[1] = cpu/mem-stores/P
         event[2] = dummy:u
        ============================================================================
                                  samples     offset       size  field
                  1          0          0          0         64  struct page     {
                  0          0          0          0          8      long unsigned int  flags;
                  0          0          0          8         40      union       {
                  0          0          0          8         40          struct          {
                  0          0          0          8         16              union       {
                  0          0          0          8         16                  struct list_head       lru {
                  0          0          0          8          8                      struct list_head*  next;
                  0          0          0         16          8                      struct list_head*  prev;
                                                                                 };
                  0          0          0          8         16                  struct          {
                  0          0          0          8          8                      void*      __filler;
                  0          0          0         16          4                      unsigned int       mlock_count;
                                                                                 };
                  0          0          0          8         16                  struct list_head       buddy_list {
                  0          0          0          8          8                      struct list_head*  next;
                  0          0          0         16          8                      struct list_head*  prev;
                                                                                 };
      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-16-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      227ad323
    • 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
    • Namhyung Kim's avatar
      perf report: Add 'symoff' sort key · e2c1c8ff
      Namhyung Kim authored
      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: 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-14-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e2c1c8ff
    • Namhyung Kim's avatar
      perf report: Add 'typeoff' sort key · 871304a7
      Namhyung Kim authored
      The typeoff sort key shows the data type name, offset and the name of
      the field.  This is useful to see which field in the struct is accessed
      most frequently.
      
        $ perf report -s type,typeoff --hierarchy --stdio
        ...
        #     Overhead  Data Type / Data Type Offset
        # ............  ............................
        #
        ...
              1.23%     struct cfs_rq
                 0.19%    struct cfs_rq +404 (throttle_count)
                 0.19%    struct cfs_rq +0 (load.weight)
                 0.19%    struct cfs_rq +336 (leaf_cfs_rq_list.next)
                 0.09%    struct cfs_rq +272 (propagate)
                 0.09%    struct cfs_rq +196 (removed.nr)
                 0.09%    struct cfs_rq +80 (curr)
                 0.09%    struct cfs_rq +544 (lt_b_children_throttled)
                 0.06%    struct cfs_rq +320 (rq)
      
      Committer testing:
      
      Again with the perf.data from the previous csets:
      
        # perf report --stdio -s type,typeoff
        # 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
        # ........  .........  ................
        #
            42.86%  struct list_head  struct list_head +8 (prev)
            42.86%  (unknown)  (unknown) +0 (no field)
            14.29%  char       char +0 (no field)
      
        #
        # (Tip: To see callchains in a more compact form: perf report -g folded)
        #
        # perf report --stdio -s dso,type,typeoff
        # 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  Shared Object         Data Type  Data Type Offset
        # ........  ....................  .........  ................
        #
            42.86%  [kernel.kallsyms]     struct list_head  struct list_head +8 (prev)
            28.57%  libc.so.6             (unknown)  (unknown) +0 (no field)
            14.29%  [kernel.kallsyms]     char       char +0 (no field)
            14.29%  ld-linux-x86-64.so.2  (unknown)  (unknown) +0 (no field)
      
        #
        # (Tip: If you have debuginfo enabled, try: perf report -s sym,srcline)
        #
        #
      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-13-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      871304a7
    • Namhyung Kim's avatar
      perf annotate-data: Update sample histogram for type · 9bd7ddd1
      Namhyung Kim authored
      The annotated_data_type__update_samples() to get histogram for data type
      access.
      
      It'll be called by perf annotate to show which fields in the data type
      are accessed frequently.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-12-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9bd7ddd1
    • Namhyung Kim's avatar
      perf annotate-data: Add member field in the data type · 4a111cad
      Namhyung Kim authored
      Add child member field if the current type is a composite type like a
      struct or union.  The member fields are linked in the children list and
      do the same recursively if the child itself is a composite type.
      
      Add 'self' member to the annotated_data_type to handle the members in
      the same way.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-11-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4a111cad
    • Namhyung Kim's avatar
      perf report: Support data type profiling · 81e57dee
      Namhyung Kim authored
      Enable type annotation when the 'type' sort key is used.
      
      It shows type of variables the samples access at the moment.  Users can
      see which types are accessed frequently.
      
        $ perf report -s dso,type --stdio
        ...
        # Overhead  Shared Object      Data Type
        # ........  .................  .........
        #
            35.47%  [kernel.kallsyms]  (unknown)
             1.62%  [kernel.kallsyms]  struct sched_entry
             1.23%  [kernel.kallsyms]  struct cfs_rq
             0.83%  [kernel.kallsyms]  struct task_struct
             0.34%  [kernel.kallsyms]  struct list_head
             0.30%  [kernel.kallsyms]  struct mem_cgroup
        ...
      
      Committer testing:
      
      With the perf.data file collected in the previous cset:
      
        # perf report --stdio -s type
        # 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
        # ........  .........
        #
            42.86%  struct list_head
            42.86%  (unknown)
            14.29%  char
      
        #
        # (Tip: To record callchains for each sample: perf record -g)
        #
        # perf report --stdio -s dso,type
        # 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  Shared Object         Data Type
        # ........  ....................  .........
        #
            42.86%  [kernel.kallsyms]     struct list_head
            28.57%  libc.so.6             (unknown)
            14.29%  [kernel.kallsyms]     char
            14.29%  ld-linux-x86-64.so.2  (unknown)
      
        #
        # (Tip: Save output of perf stat using: perf stat record <target workload>)
        #
        #
      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-10-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      81e57dee
    • Namhyung Kim's avatar
      perf report: Add 'type' sort key · 2f2c41bd
      Namhyung Kim authored
      The 'type' sort key is to aggregate hist entries by data type they
      access.  Add mem_type field to hist_entry struct to save the type.  If
      hist_entry__get_data_type() returns NULL, it'd use the 'unknown_type'
      instance.
      
      Committer testing:
      
      Before:
      
        # perf mem record  sleep 2s
        [ perf record: Woken up 1 times to write data ]
        [ perf record: Captured and wrote 0.037 MB perf.data (4 samples) ]
        root@number:/home/acme/Downloads# perf report --stdio -s type
        Error:
        Unknown --sort key: `type'
         Usage: perf report [<options>]
      
            -s, --sort <key[,key2...]>
                                  sort by key(s): overhead overhead_sys overhead_us overhead_guest_sys
                                  overhead_guest_us overhead_children sample period
                                  pid comm dso symbol parent cpu socket srcline srcfile
                                  local_weight weight transaction trace symbol_size
                                  dso_size cgroup cgroup_id ipc_null time code_page_size
                                  local_ins_lat ins_lat local_p_stage_cyc p_stage_cyc
                                  addr local_retire_lat retire_lat simd dso_from dso_to
                                  symbol_from symbol_to mispredict abort in_tx cycles
                                  srcline_from srcline_to ipc_lbr addr_from addr_to
                                  symbol_daddr dso_daddr locked tlb mem snoop dcacheline
                                  symbol_iaddr phys_daddr data_page_size blocked
        #
      
      After:
      
        # perf report --stdio -s type
        # 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
        # ........  .........
        #
           100.00%  (unknown)
      
        #
        # (Tip: Print event counts in CSV format with: perf stat -x,)
        #
        # rpm -q kernel-debuginfo
        kernel-debuginfo-6.6.4-200.fc39.x86_64
        # uname -r
        6.6.4-200.fc39.x86_64
        #
      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-9-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2f2c41bd
    • Namhyung Kim's avatar
      perf annotate: Implement hist_entry__get_data_type() · 67bc54bb
      Namhyung Kim authored
      It's the function to find out the type info from the given sample data
      and will be called from the hist_entry sort logic when 'type' sort key
      is used.
      
      It first calls objdump to disassemble the instructions and figure out
      information about memory access at the location.  Maybe we can do it
      better by analyzing the instruction directly, but I'll leave it for
      later work.
      
      The memory access is determined by checking instruction operands to
      have "(" and then extract register name and offset.  It'll return NULL
      if no data type is found.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-8-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      67bc54bb
    • Namhyung Kim's avatar
      perf annotate: Add annotate_get_insn_location() · 3a0c26ed
      Namhyung Kim authored
      The annotate_get_insn_location() is to get the detailed information of
      instruction locations like registers and offset.  It has source and
      target operands locations in an array.  Each operand can have a register
      and an offset.  The offset is meaningful when mem_ref flag is set.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-7-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3a0c26ed
    • Namhyung Kim's avatar
      perf annotate: Factor out evsel__get_arch() · 0669729e
      Namhyung Kim authored
      The evsel__get_arch() is to get architecture info from the environment.
      
      It'll be used by other places later so let's factor it out.
      
      Also add arch__is() to check the arch info by name.
      
      Committer notes:
      
      "get" is usually associated with refcounting, so we better rename this
      at some point to a better name.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-6-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0669729e
    • Namhyung Kim's avatar
      perf annotate-data: Add dso->data_types tree · fc044c53
      Namhyung Kim authored
      To aggregate accesses to the same data type, add 'data_types' tree in
      DSO to maintain data types and find it by name and size.
      
      It might have different data types that happen to have the same name,
      so it also compares the size of the type.
      
      Even if it doesn't 100% guarantee, it reduces the possibility of
      mis-handling of such conflicts.
      
      And I don't think it's common to have different types with the same
      name.
      
      Committer notes:
      
      Very few cases on the Linux kernel, but there are some different types
      with the same name, unsure if there is a debug mode in libbpf dedup that
      warns about such cases, but there are provisions in pahole for that,
      see:
      
        "emit: Notice type shadowing, i.e. multiple types with the same name (enum, struct, union, etc)"
          https://git.kernel.org/pub/scm/devel/pahole/pahole.git/commit/?id=4f332dbfd02072e4f410db7bdcda8d6e3422974b
      
        $ pahole --compile > vmlinux.h
        $ rm -f a ; make a
        cc     a.c   -o a
        $ grep __[0-9] vmlinux.h
        union irte__1 {
        struct map_info__1;
        struct map_info__1 {
        	struct map_info__1 *       next;                 /*     0     8 */
        $
      
        drivers/iommu/amd/amd_iommu_types.h 'union irte'
        include/linux/dmar.h                'struct irte'
      
        include/linux/device-mapper.h:
      
          union map_info {
                  void *ptr;
          };
      
        include/linux/mtd/map.h:
      
          struct map_info {
              const char *name;
              unsigned long size;
              resource_size_t phys;
         <SNIP>
      
        kernel/events/uprobes.c:
      
         struct map_info {
              struct map_info *next;
              struct mm_struct *mm;
              unsigned long vaddr;
        };
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-5-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      fc044c53
    • Namhyung Kim's avatar
      perf annotate-data: Add find_data_type() to get type from memory access · b9c87f53
      Namhyung Kim authored
      The find_data_type() is to get a data type from the memory access at the
      given address (IP) using a register and an offset.
      
      It requires DWARF debug info in the DSO and searches the list of
      variables and function parameters in the scope.
      
      In a pseudo code, it does basically the following:
      
        find_data_type(dso, ip, reg, offset)
        {
            pc = map__rip_2objdump(ip);
            CU = dwarf_addrdie(dso->dwarf, pc);
            scopes = die_get_scopes(CU, pc);
            for_each_scope(S, scopes) {
                V = die_find_variable_by_reg(S, pc, reg);
                if (V && V.type == pointer_type) {
                    T = die_get_real_type(V);
                    if (offset < T.size)
                        return T;
                }
            }
            return NULL;
        }
      
      Committer notes:
      
      The 'size' variable in check_variable() is 64-bit, so use PRIu64 and
      inttypes.h to debug it.
      
      Ditto at find_data_type_die().
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      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-4-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b9c87f53
  5. 23 Dec, 2023 2 commits
  6. 21 Dec, 2023 2 commits
  7. 20 Dec, 2023 5 commits
    • Ian Rogers's avatar
      perf maps: Fix up overlaps during fixup_end · 7887097c
      Ian Rogers authored
      Maps are sometimes made overlapping, in particular kernel maps. If the
      end of a map overlaps the start of the next, shorten the overlapping
      map. This should remove potential non-determinism in maps__find, ie
      finding maps by address.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Colin Ian King <colin.i.king@gmail.com>
      Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
      Cc: German Gomez <german.gomez@arm.com>
      Cc: Guilherme Amadio <amadio@gentoo.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Li Dong <lidong@vivo.com>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Miguel Ojeda <ojeda@kernel.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Terrell <terrelln@fb.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steinar H. Gunderson <sesse@google.com>
      Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: Wenyu Liu <liuwenyu7@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20231207011722.1220634-23-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7887097c
    • Ian Rogers's avatar
      perf maps: Reduce scope of map_rb_node and maps internals · 631bb236
      Ian Rogers authored
      Avoid exposing the implementation of maps so that the internals can be
      refactored.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Colin Ian King <colin.i.king@gmail.com>
      Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
      Cc: German Gomez <german.gomez@arm.com>
      Cc: Guilherme Amadio <amadio@gentoo.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Li Dong <lidong@vivo.com>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Miguel Ojeda <ojeda@kernel.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Terrell <terrelln@fb.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steinar H. Gunderson <sesse@google.com>
      Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: Wenyu Liu <liuwenyu7@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20231207011722.1220634-22-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      631bb236
    • Ian Rogers's avatar
      perf maps: Add find next entry to give entry after the given map · 75858007
      Ian Rogers authored
      Use to remove map_rb_node use from machine.c.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Colin Ian King <colin.i.king@gmail.com>
      Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
      Cc: German Gomez <german.gomez@arm.com>
      Cc: Guilherme Amadio <amadio@gentoo.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Li Dong <lidong@vivo.com>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Miguel Ojeda <ojeda@kernel.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Terrell <terrelln@fb.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steinar H. Gunderson <sesse@google.com>
      Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: Wenyu Liu <liuwenyu7@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20231207011722.1220634-21-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      75858007
    • Ian Rogers's avatar
      perf maps: Add maps__load_first() · e77b0236
      Ian Rogers authored
      Avoid bpf_lock_contention_read touching the internal maps data structure
      by adding a helper function. As access is done directly on the map in
      maps, hold the read lock to stop it being removed.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Colin Ian King <colin.i.king@gmail.com>
      Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
      Cc: German Gomez <german.gomez@arm.com>
      Cc: Guilherme Amadio <amadio@gentoo.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Li Dong <lidong@vivo.com>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Miguel Ojeda <ojeda@kernel.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Nick Terrell <terrelln@fb.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steinar H. Gunderson <sesse@google.com>
      Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: Wenyu Liu <liuwenyu7@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20231207011722.1220634-20-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e77b0236
    • Ian Rogers's avatar
      perf maps: Rename clone to copy from · 90849527
      Ian Rogers authored
      Rename maps__clone() to maps__copy_from() to be more intention revealing
      of its behavior. Pass the underlying maps rather than the thread.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Colin Ian King <colin.i.king@gmail.com>
      Cc: Dmitrii Dolgov <9erthalion6@gmail.com>
      Cc: German Gomez <german.gomez@arm.com>
      Cc: Guilherme Amadio <amadio@gentoo.org>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: K Prateek Nayak <kprateek.nayak@amd.com>
      Cc: Kajol Jain <kjain@linux.ibm.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Leo Yan <leo.yan@linaro.org>
      Cc: Li Dong <lidong@vivo.com>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Masami Hiramatsu <mhiramat@kernel.org>
      Cc: Miguel Ojeda <ojeda@kernel.org>
      Cc: Ming Wang <wangming01@loongson.cn>
      Cc: Nick Terrell <terrelln@fb.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Sean Christopherson <seanjc@google.com>
      Cc: Steinar H. Gunderson <sesse@google.com>
      Cc: Vincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: Wenyu Liu <liuwenyu7@huawei.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20231207011722.1220634-19-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      90849527