1. 21 Mar, 2024 40 commits
    • Ian Rogers's avatar
      perf list: Allow wordwrap to wrap on commas · aa1f4ad2
      Ian Rogers authored
      A raw event encoding may be a block with terms separated by commas. If
      wrapping such a string it would be useful to break at the commas, so
      add this ability to wordwrap.
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Tested-by: default avatarKan Liang <kan.liang@linux.intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20240308001915.4060155-4-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      aa1f4ad2
    • Ian Rogers's avatar
      perf pmu: Drop "default_core" from alias names · 39aa4ff6
      Ian Rogers authored
      "default_core" is used by jevents.py for json events' PMU name when
      none is specified. On x86 the "default_core" is typically the PMU
      "cpu". When creating an alias see if the event's PMU name is
      "default_core" in which case don't record it. This means in places
      like "perf list" the PMU's name will be used in its place.
      
      Before:
      
      $ perf list --details
        ...
        cache:
          l1d.replacement
               [Counts the number of cache lines replaced in L1 data cache]
                default_core/event=0x51,period=0x186a3,umask=0x1/
        ...
      
      After:
      
      $ perf list --details
        ...
        cache:
          l1d.replacement
               [Counts the number of cache lines replaced in L1 data cache. Unit: cpu]
                cpu/event=0x51,period=0x186a3,umask=0x1/
        ...
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Tested-by: default avatarKan Liang <kan.liang@linux.intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20240308001915.4060155-3-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      39aa4ff6
    • Ian Rogers's avatar
      perf list: Add tracepoint encoding to detailed output · 525615ef
      Ian Rogers authored
      The tracepoint id holds the config value and is probed in determining
      what an event is. Add reading of the id so that we can display the
      event encoding as:
      
        $ perf list --details
        ...
          alarmtimer:alarmtimer_cancel                       [Tracepoint event]
                tracepoint/config=0x18c/
        ...
      Signed-off-by: default avatarIan Rogers <irogers@google.com>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Tested-by: default avatarKan Liang <kan.liang@linux.intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ravi Bangoria <ravi.bangoria@amd.com>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Link: https://lore.kernel.org/r/20240308001915.4060155-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      525615ef
    • Arnaldo Carvalho de Melo's avatar
      perf beauty: Introduce scrape script for 'clone' syscall 'flags' argument · 2316ef58
      Arnaldo Carvalho de Melo authored
      It was using the first variation on producing a string representation
      for a binary flag, one that used the copy of uapi/linux/sched.h with
      preprocessor tricks that had to be updated everytime a new flag was
      introduced.
      
      Use the more recent scrape script + strarray + strarray__scnprintf_flags() combo.
      
        $ tools/perf/trace/beauty/clone.sh | head -5
        static const char *clone_flags[] = {
        	[ilog2(0x00000100) + 1] = "VM",
        	[ilog2(0x00000200) + 1] = "FS",
        	[ilog2(0x00000400) + 1] = "FILES",
        	[ilog2(0x00000800) + 1] = "SIGHAND",
        $
      
      Now we can move uapi/linux/sched.h from tools/include/, that is used for
      building perf to the scrape only directory tools/perf/trace/beauty/include.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lore.kernel.org/lkml/ZfnULIn3XKDq0bpc@x1Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2316ef58
    • Namhyung Kim's avatar
      perf annotate-data: Do not retry for invalid types · bd62de08
      Namhyung Kim authored
      In some cases, it was able to find a type or location info (for per-cpu
      variable) but cannot match because of invalid offset or missing global
      information.  In those cases, it's meaningless to go to the outer scope
      and retry because there will be no additional information.
      
      Let's change the return type of find_matching_type() and bail out if it
      returns -1 for the cases.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-24-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bd62de08
    • Namhyung Kim's avatar
      perf annotate-data: Add a cache for global variable types · 55ee3d00
      Namhyung Kim authored
      They are often searched by many different places.  Let's add a cache
      for them to reduce the duplicate DWARF access.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-23-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      55ee3d00
    • Namhyung Kim's avatar
      perf annotate-data: Add stack canary type · b3c95109
      Namhyung Kim authored
      When the stack protector is enabled, compiler would generate code to
      check stack overflow with a special value called 'stack carary' at
      runtime.  On x86_64, GCC hard-codes the stack canary as %gs:40.
      
      While there's a definition of fixed_percpu_data in asm/processor.h,
      it seems that the header is not included everywhere and many places
      it cannot find the type info.  As it's in the well-known location (at
      %gs:40), let's add a pseudo stack canary type to handle it specially.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-22-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b3c95109
    • Namhyung Kim's avatar
      perf annotate-data: Handle ADD instructions · eb9190af
      Namhyung Kim authored
      There are different patterns for percpu variable access using a constant
      value added to the base.
      
        2aeb:  mov    -0x7da0f7e0(,%rax,8),%r14  # r14 = __per_cpu_offset[cpu]
        2af3:  mov    $0x34740,%rax              # rax = address of runqueues
      * 2afa:  add    %rax,%r14                  # r14 = &per_cpu(runqueues, cpu)
        2bfd:  cmpl   $0x0,0x10(%r14)            # cpu_rq(cpu)->has_blocked_load
        2b03:  je     0x2b36
      
      At the first instruction, r14 has the __per_cpu_offset.  And then rax
      has an immediate value and then added to r14 to calculate the address of
      a per-cpu variable.  So it needs to track the immediate values and ADD
      instructions.
      
      Similar but a little different case is to use "this_cpu_off" instead of
      "__per_cpu_offset" for the current CPU.  This time the variable address
      comes with PC-rel addressing.
      
        89:  mov     $0x34740,%rax                # rax = address of runqueues
      * 90:  add     %gs:0x7f015f60(%rip),%rax    # 19a78  <this_cpu_off>
        98:  incl    0xd8c(%rax)                  # cpu_rq(cpu)->sched_count
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-21-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      eb9190af
    • Namhyung Kim's avatar
      perf annotate-data: Support general per-cpu access · f5b09592
      Namhyung Kim authored
      This is to support per-cpu variable access often without a matching
      DWARF entry.  For some reason, I cannot find debug info of per-cpu
      variables sometimes.  They have more complex pattern to calculate the
      address of per-cpu variables like below.
      
        2b7d:  mov    -0x1e0(%rbp),%rax           ; rax = cpu
        2b84:  mov    -0x7da0f7e0(,%rax,8),%rcx   ; rcx = __per_cpu_offset[cpu]
      * 2b8c:  mov    0x34870(%rcx),%rax          ; *(__per_cpu_offset[cpu] + 0x34870)
      
      Let's assume the rax register has a number for a CPU at 2b7d.  The next
      instruction is to get the per-cpu offset' for that cpu.  The offset
      -0x7da0f7e0 is 0xffffffff825f0820 in u64 which is the address of the
      '__per_cpu_offset' array in my system.  So it'd get the actual offset
      of that CPU's per-cpu region and save it to the rcx register.
      
      Then, at 2b8c, accesses using rcx can be handled same as the global
      variable access.  To handle this case, it should check if the offset
      of the instruction matches to the address of '__per_cpu_offset'.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-20-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f5b09592
    • Namhyung Kim's avatar
      perf annotate-data: Track instructions with a this-cpu variable · ad62edbf
      Namhyung Kim authored
      Like global variables, this per-cpu variables should be tracked
      correctly.  Factor our get_global_var_type() to handle both global
      and per-cpu (for this cpu) variables in the same manner.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-19-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ad62edbf
    • Namhyung Kim's avatar
      perf annotate-data: Handle this-cpu variables in kernel · 02e17ca9
      Namhyung Kim authored
      On x86, the kernel gets the current task using the current macro like
      below:
      
        #define current  get_current()
      
        static __always_inline struct task_struct *get_current(void)
        {
            return this_cpu_read_stable(pcpu_hot.current_task);
        }
      
      So it returns the current_task field of struct pcpu_hot which is the
      first member.  On my build, it's located at 0x32940.
      
        $ nm vmlinux | grep pcpu_hot
        0000000000032940 D pcpu_hot
      
      And the current macro generates the instructions like below:
      
        mov  %gs:0x32940, %rcx
      
      So the %gs segment register points to the beginning of the per-cpu
      region of this cpu and it points the variable with a constant.
      
      Let's update the instruction location info to have a segment register
      and handle %gs in kernel to look up a global variable.  Pretend it as
      a global variable by changing the register number to DWARF_REG_PC.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-18-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      02e17ca9
    • Namhyung Kim's avatar
      perf annotate: Parse x86 segment register location · cbaf89a8
      Namhyung Kim authored
      Add a segment field in the struct annotated_insn_loc and save it for the
      segment based addressing like %gs:0x28.  For simplicity it now handles
      %gs register only.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-17-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cbaf89a8
    • Namhyung Kim's avatar
      perf annotate-data: Check register state for type · bdc80ace
      Namhyung Kim authored
      As instruction tracking updates the type state for each register, check
      the final type info for the target register at the given instruction.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-16-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bdc80ace
    • Namhyung Kim's avatar
      perf annotate-data: Implement instruction tracking · eb8a55e0
      Namhyung Kim authored
      If it failed to find a variable for the location directly, it might be
      due to a missing variable in the source code.  For example, accessing
      pointer variables in a chain can result in the case like below:
      
        struct foo *foo = ...;
      
        int i = foo->bar->baz;
      
      The DWARF debug information is created for each variable so it'd have
      one for 'foo'.  But there's no variable for 'foo->bar' and then it
      cannot know the type of 'bar' and 'baz'.
      
      The above source code can be compiled to the follow x86 instructions:
      
        mov  0x8(%rax), %rcx
        mov  0x4(%rcx), %rdx   <=== PMU sample
        mov  %rdx, -4(%rbp)
      
      Let's say 'foo' is located in the %rax and it has a pointer to struct
      foo.  But perf sample is captured in the second instruction and there
      is no variable or type info for the %rcx.
      
      It'd be great if compiler could generate debug info for %rcx, but we
      should handle it on our side.  So this patch implements the logic to
      iterate instructions and update the type table for each location.
      
      As it already collected a list of scopes including the target
      instruction, we can use it to construct the type table smartly.
      
        +----------------  scope[0] subprogram
        |
        | +--------------  scope[1] lexical_block
        | |
        | | +------------  scope[2] inlined_subroutine
        | | |
        | | | +----------  scope[3] inlined_subroutine
        | | | |
        | | | | +--------  scope[4] lexical_block
        | | | | |
        | | | | |     ***  target instruction
        ...
      
      Image the target instruction has 5 scopes, each scope will have its own
      variables and parameters.  Then it can start with the innermost scope
      (4).  So it'd search the shortest path from the start of scope[4] to
      the target address and build a list of basic blocks.  Then it iterates
      the basic blocks with the variables in the scope and update the table.
      If it finds a type at the target instruction, then returns it.
      
      Otherwise, it moves to the upper scope[3].  Now it'd search the shortest
      path from the start of scope[3] to the start of scope[4].  Then connect
      it to the existing basic block list.  Then it'd iterate the blocks with
      variables for both scopes.  It can repeat this until it finds a type at
      the target instruction or reaches to the top scope[0].
      
      As the basic blocks contain the shortest path, it won't worry about
      branches and can update the table simply.
      
      The final check will be done by find_matching_type() in the next patch.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-15-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      eb8a55e0
    • Namhyung Kim's avatar
      perf annotate-data: Handle call instructions · cffb7910
      Namhyung Kim authored
      When updating instruction states, the call instruction should play a
      role since it changes the register states.  For simplicity, mark some
      registers as caller-saved registers (should be arch-dependent), and
      invalidate them all after a function call.
      
      If the function returns something, the designated register (ret_reg)
      will have the type info.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-14-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cffb7910
    • Namhyung Kim's avatar
      perf annotate-data: Handle global variable access · 0a41e5d6
      Namhyung Kim authored
      When updating the instruction states, it also needs to handle global
      variable accesses.  Same as it does for PC-relative addressing, it can
      look up the type by address (if it's defined in the same file), or by
      name after finding the symbol by address (for declarations).
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-13-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0a41e5d6
    • Namhyung Kim's avatar
      perf annotate-data: Add get_global_var_type() · 1ebb5e17
      Namhyung Kim authored
      Accessing global variable is common when it tracks execution later.
      Factor out the common code into a function for later use.
      
      It adds thread and cpumode to struct data_loc_info to find (global)
      symbols if needed.  Also remove var_name as it's retrieved in the
      helper function.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-12-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1ebb5e17
    • Namhyung Kim's avatar
      perf annotate-data: Add update_insn_state() · 4f903455
      Namhyung Kim authored
      The update_insn_state() function is to update the type state table after
      processing each instruction.  For now, it handles MOV (on x86) insn
      to transfer type info from the source location to the target.
      
      The location can be a register or a stack slot.  Check carefully when
      memory reference happens and fetch the type correctly.  It basically
      ignores write to a memory since it doesn't change the type info.  One
      exception is writes to (new) stack slots for register spilling.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-11-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4f903455
    • Namhyung Kim's avatar
      perf annotate-data: Maintain variable type info · 06b2ce75
      Namhyung Kim authored
      As it collected basic block and variable information in each scope, it
      now can build a state table to find matching variable at the location.
      
      The struct type_state is to keep the type info saved in each register
      and stack slot.  The update_var_state() updates the table when it finds
      variables in the current address.  It expects die_collect_vars() filled
      a list of variables with type info and starting address.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-10-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      06b2ce75
    • Namhyung Kim's avatar
      perf annotate-data: Add debug messages · 90429524
      Namhyung Kim authored
      Add a new debug option "type-profile" to enable the detailed info during
      the type analysis especially for instruction tracking.  You can use this
      before the command name like 'report' or 'annotate'.
      
        $ perf --debug type-profile annotate --data-type
      
      Committer testing:
      
      First get some memory events:
      
        $ perf mem record ls
      
      Then, without data-type profiling debug:
      
        $ perf annotate --data-type | head
        Annotate type: 'struct rtld_global' in /usr/lib64/ld-linux-x86-64.so.2 (1 samples):
        ============================================================================
            samples     offset       size  field
                  1          0       4336  struct rtld_global	 {
                  0          0          0      struct link_namespaces*	_dl_ns;
                  0       2560          8      size_t	_dl_nns;
                  0       2568         40      __rtld_lock_recursive_t	_dl_load_lock {
                  0       2568         40          pthread_mutex_t	mutex {
                  0       2568         40              struct __pthread_mutex_s	__data {
                  0       2568          4                  int	__lock;
        $
      
      And with only data-type profiling:
      
        $ perf --debug type-profile annotate --data-type | head
        -----------------------------------------------------------
        find_data_type_die [1e67] for reg13873052 (PC) offset=0x150e2 in dl_main
        CU die offset: 0x29cd3
        found PC-rel by addr=0x34020 offset=0x20
        -----------------------------------------------------------
        find_data_type_die [2e] for reg12 offset=0 in __GI___readdir64
        CU die offset: 0x137a45
        frame base: cfa=1 fbreg=-1
        found "__futex" in scope=2/2 (die: 0x137ad5) 0(reg12) type=int (die:2a)
        -----------------------------------------------------------
        find_data_type_die [52] for reg5 offset=0 in __memmove_avx_unaligned_erms
        CU die offset: 0x1124ed
        no variable found
        Annotate type: 'struct rtld_global' in /usr/lib64/ld-linux-x86-64.so.2 (1 samples):
        ============================================================================
            samples     offset       size  field
                  1          0       4336  struct rtld_global	 {
                  0          0          0      struct link_namespaces*	_dl_ns;
                  0       2560          8      size_t	_dl_nns;
                  0       2568         40      __rtld_lock_recursive_t	_dl_load_lock {
                  0       2568         40          pthread_mutex_t	mutex {
                  0       2568         40              struct __pthread_mutex_s	__data {
                  0       2568          4                  int	__lock;
        $
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-9-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      90429524
    • Namhyung Kim's avatar
      perf annotate: Add annotate_get_basic_blocks() · 5cdd3fd7
      Namhyung Kim authored
      The annotate_get_basic_blocks() is to find a list of basic blocks from
      the source instruction to the destination instruction in a function.
      
      It'll be used to find variables in a scope.  Use BFS (Breadth First
      Search) to find a shortest path to carry the variable/register state
      minimally.
      
      Also change find_disasm_line() to be used in annotate_get_basic_blocks()
      and add 'allow_update' argument to control if it can update the IP.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-8-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      5cdd3fd7
    • Namhyung Kim's avatar
      perf annotate-data: Introduce 'struct data_loc_info' · a3f4d5b5
      Namhyung Kim authored
      The find_data_type() needs many information to describe the location of
      the data.  Add the new 'struct data_loc_info' to pass those information at
      once.
      
      No functional changes intended.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-7-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a3f4d5b5
    • Namhyung Kim's avatar
      perf map: Add map__objdump_2rip() · 52a09bc2
      Namhyung Kim authored
      Sometimes we want to convert an address in objdump output to
      map-relative address to match with a sample data.  Let's add
      map__objdump_2rip() for that.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-6-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      52a09bc2
    • Namhyung Kim's avatar
      perf dwarf-aux: Add die_find_func_rettype() · 7a838c2f
      Namhyung Kim authored
      The die_find_func_rettype() is to find a debug entry for the given
      function name and sets the type information of the return value.  By
      convention, it'd return the pointer to the type die (should be the
      same as the given mem_die argument) if found, or NULL otherwise.
      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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-5-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      7a838c2f
    • Namhyung Kim's avatar
      perf dwarf-aux: Handle type transfer for memory access · 437683a9
      Namhyung Kim authored
      We want to track type states as instructions are executed.  Each
      instruction can access compound types like struct or union and load/
      store its members to a different location.
      
      The die_deref_ptr_type() is to find a type of memory access with a
      pointer variable.  If it points to a compound type like struct, the
      target memory is a member in the struct.  The access will happen with an
      offset indicating which member it refers.  Let's follow the DWARF info
      to figure out the type of the pointer target.
      
      For example, say we have the following code.
      
        struct foo {
          int a;
          int b;
        };
      
        struct foo *p = malloc(sizeof(*p));
        p->b = 0;
      
      The last pointer access should produce x86 asm like below:
      
        mov  0x0, 4(%rbx)
      
      And we know %rbx register has a pointer to struct foo.  Then offset 4
      should return the debug info of member 'b'.
      
      Also variables of compound types can be accessed directly without a
      pointer.  The die_get_member_type() is to handle a such case.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Acked-by: default avatarMasami Hiramatsu <mhiramat@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: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: https://lore.kernel.org/r/20240319055115.4063940-4-namhyung@kernel.org
      [ Check if die_get_real_type() returned NULL ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      437683a9
    • Namhyung Kim's avatar
      perf dwarf-aux: Add die_collect_vars() · 932dcc2c
      Namhyung Kim authored
      The die_collect_vars() is to find all variable information in the scope
      including function parameters.  The struct die_var_type is to save the
      type of the variable with the location (reg and offset) as well as where
      it's defined in the code (addr).
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Acked-by: default avatarMasami Hiramatsu <mhiramat@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: Peter Zijlstra <peterz@infradead.org>
      Cc: Stephane Eranian <eranian@google.com>
      Link: https://lore.kernel.org/r/20240319055115.4063940-3-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      932dcc2c
    • Namhyung Kim's avatar
      perf dwarf-aux: Remove unused pc argument · b508965d
      Namhyung Kim authored
      It's not used, let's get rid of it.
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Reviewed-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>
      Link: https://lore.kernel.org/r/20240319055115.4063940-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b508965d
    • Ian Rogers's avatar
      perf cpumap: Use perf_cpu_map__for_each_cpu when possible · 71bc3ac8
      Ian Rogers authored
      Rather than manually iterating the CPU map, use
      perf_cpu_map__for_each_cpu(). When possible tidy local variables.
      Reviewed-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-9-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      71bc3ac8
    • Ian Rogers's avatar
      perf stat: Remove duplicate cpus_map_matched function · 954ac1b4
      Ian Rogers authored
      Use libperf's perf_cpu_map__equal() that performs the same function.
      Reviewed-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-8-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      954ac1b4
    • Ian Rogers's avatar
      perf arm64 header: Remove unnecessary CPU map get and put · 4ddccd00
      Ian Rogers authored
      In both cases the CPU map is known owned by either the caller or a
      PMU.
      Reviewed-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-7-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4ddccd00
    • Ian Rogers's avatar
      perf cpumap: Clean up use of perf_cpu_map__has_any_cpu_or_is_empty · 3e5deb70
      Ian Rogers authored
      Most uses of what was perf_cpu_map__empty but is now
      perf_cpu_map__has_any_cpu_or_is_empty want to do something with the
      CPU map if it contains CPUs. Replace uses of
      perf_cpu_map__has_any_cpu_or_is_empty with other helpers so that CPUs
      within the map can be handled.
      Reviewed-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-6-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3e5deb70
    • Ian Rogers's avatar
      perf intel-pt/intel-bts: Switch perf_cpu_map__has_any_cpu_or_is_empty use · 291dcd77
      Ian Rogers authored
      Switch perf_cpu_map__has_any_cpu_or_is_empty() to
      perf_cpu_map__is_any_cpu_or_is_empty() as a CPU map may contain CPUs as
      well as the dummy event and perf_cpu_map__is_any_cpu_or_is_empty() is a
      more correct alternative.
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      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: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-5-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      291dcd77
    • Ian Rogers's avatar
      perf arm-spe/cs-etm: Directly iterate CPU maps · e28ee123
      Ian Rogers authored
      Rather than iterate all CPUs and see if they are in CPU maps, directly
      iterate the CPU map. Similarly make use of the intersect function
      taking care for when "any" CPU is specified. Switch
      perf_cpu_map__has_any_cpu_or_is_empty() to more appropriate
      alternatives.
      Reviewed-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-4-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e28ee123
    • Ian Rogers's avatar
      libperf cpumap: Ensure empty cpumap is NULL from alloc · dcd45b37
      Ian Rogers authored
      Potential corner cases could cause a cpumap to be allocated with size
      0, but an empty cpumap should be represented as NULL. Add a path in
      perf_cpu_map__alloc() to ensure this.
      Suggested-by: default avatarJames Clark <james.clark@arm.com>
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      Cc: Huacai Chen <chenhuacai@kernel.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Closes: https://lore.kernel.org/lkml/2cd09e7c-eb88-6726-6169-647dcd0a8101@arm.com/
      Link: https://lore.kernel.org/r/20240202234057.2085863-3-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      dcd45b37
    • Ian Rogers's avatar
      libperf cpumap: Add any, empty and min helpers · b6b4a62d
      Ian Rogers authored
      Additional helpers to better replace perf_cpu_map__has_any_cpu_or_is_empty().
      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: Alexandre Ghiti <alexghiti@rivosinc.com>
      Cc: Andrew Jones <ajones@ventanamicro.com>
      Cc: André Almeida <andrealmeid@igalia.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Atish Patra <atishp@rivosinc.com>
      Cc: Changbin Du <changbin.du@huawei.com>
      Cc: Darren Hart <dvhart@infradead.org>
      Cc: Davidlohr Bueso <dave@stgolabs.net>
      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: John Garry <john.g.garry@oracle.com>
      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: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Paran Lee <p4ranlee@gmail.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: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yang Jihong <yangjihong1@huawei.com>
      Cc: Yang Li <yang.lee@linux.alibaba.com>
      Cc: Yanteng Si <siyanteng@loongson.cn>
      Link: https://lore.kernel.org/r/20240202234057.2085863-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b6b4a62d
    • Ethan Adams's avatar
      perf build: Fix out of tree build related to installation of sysreg-defs · efae55bb
      Ethan Adams authored
      It seems that a previous modification to sysreg-defs, which corrected
      emitting the header to the specified output directory, exposed missing
      subdir, prefix variables.
      
      This breaks out of tree builds of perf as the file is now built into the
      output directory, but still tries to descend into output directory as a
      subdir.
      
      Fixes: a29ee6ae ("perf build: Ensure sysreg-defs Makefile respects output dir")
      Reviewed-by: default avatarOliver Upton <oliver.upton@linux.dev>
      Reviewed-by: default avatarTycho Andersen <tycho@tycho.pizza>
      Signed-off-by: default avatarEthan Adams <j.ethan.adams@gmail.com>
      Tested-by: default avatarTycho Andersen <tycho@tycho.pizza>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20240314222012.47193-1-j.ethan.adams@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      efae55bb
    • Adrian Hunter's avatar
      perf auxtrace: Fix multiple use of --itrace option · bb69c912
      Adrian Hunter authored
      If the --itrace option is used more than once, the options are
      combined, but "i" and "y" (sub-)options can be corrupted because
      itrace_do_parse_synth_opts() incorrectly overwrites the period type and
      period with default values.
      
      For example, with:
      
      	--itrace=i0ns --itrace=e
      
      The processing of "--itrace=e", resets the "i" period from 0 nanoseconds
      to the default 100 microseconds.
      
      Fix by performing the default setting of period type and period only if
      "i" or "y" are present in the currently processed --itrace value.
      
      Fixes: f6986c95 ("perf session: Add instruction tracing options")
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/r/20240315071334.3478-2-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      bb69c912
    • Adrian Hunter's avatar
      perf script: Show also errors for --insn-trace option · d4a98b45
      Adrian Hunter authored
      The trace could be misleading if trace errors are not taken into
      account, so display them also by adding the itrace "e" option.
      
      Note --call-trace and --call-ret-trace already add the itrace "e"
      option.
      
      Fixes: b585ebdb ("perf script: Add --insn-trace for instruction decoding")
      Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/r/20240315071334.3478-1-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d4a98b45
    • James Clark's avatar
      perf docs arm_spe: Clarify more SPE requirements related to KPTI · 36f65f9b
      James Clark authored
      The question of exactly when KPTI needs to be disabled comes up a lot
      because it doesn't always need to be done. Add the relevant kernel
      function and some examples that describe the behavior.
      
      Also describe the interrupt requirement and that no error message will
      be printed if this isn't met.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarJames Clark <james.clark@arm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20240312132508.423320-1-james.clark@arm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      36f65f9b
    • Arnaldo Carvalho de Melo's avatar
      tools headers: Remove almost unused copy of uapi/stat.h, add few conditional defines · a672af91
      Arnaldo Carvalho de Melo authored
      These were used to build perf to provide defines not available in older
      distros, but this was back in 2017, nowadays most the distros that are
      supported and I have build containers for work using just the system
      headers, so ditch them.
      
      For the few that don't have STATX_MNT_ID{_UNIQUE}, or STATX_MNT_DIOALIGN
      add them conditionally.
      
      Some of these older distros may not have things that are used in 'perf
      trace', but then they also don't have libtraceevent packages, so don't
      build 'perf trace'.
      
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Link: https://lore.kernel.org/lkml/20240315204835.748716-6-acme@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      a672af91