1. 01 Aug, 2024 14 commits
    • Namhyung Kim's avatar
      perf test: Update sample filtering test · 9cb3549b
      Namhyung Kim authored
      Now it can run the BPF filtering test with normal user if the BPF
      objects are pinned by 'sudo perf record --setup-filter pin'.  Let's
      update the test case to verify the behavior.  It'll skip the test if the
      filter check is failed from a normal user, but it shows a message how to
      set up the filters.
      
      First, run the test as a normal user and it fails.
      
        $ perf test -vv filtering
         95: perf record sample filtering (by BPF) tests:
        --- start ---
        test child forked, pid 425677
        Checking BPF-filter privilege
        try 'sudo perf record --setup-filter pin' first.       <<<--- here
        bpf-filter test [Skipped permission]
        ---- end(-2) ----
         95: perf record sample filtering (by BPF) tests                     : Skip
      
      According to the message, run the perf record command to pin the BPF
      objects.
      
        $ sudo perf record --setup-filter pin
      
      And re-run the test as a normal user.
      
        $ perf test -vv filtering
         95: perf record sample filtering (by BPF) tests:
        --- start ---
        test child forked, pid 424486
        Checking BPF-filter privilege
        Basic bpf-filter test
        Basic bpf-filter test [Success]
        Failing bpf-filter test
        Error: task-clock event does not have PERF_SAMPLE_CPU
        Failing bpf-filter test [Success]
        Group bpf-filter test
        Error: task-clock event does not have PERF_SAMPLE_CPU
        Error: task-clock event does not have PERF_SAMPLE_CODE_PAGE_SIZE
        Group bpf-filter test [Success]
        ---- end(0) ----
         95: perf record sample filtering (by BPF) tests                     : Ok
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-9-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9cb3549b
    • Namhyung Kim's avatar
      perf record: Add --setup-filter option · 3dee4b83
      Namhyung Kim authored
      To allow BPF filters for unprivileged users it needs to pin the BPF
      objects to BPF-fs first.  Let's add a new option to pin and unpin the
      objects easily.  I'm not sure 'perf record' is a right place to do this
      but I don't have a better idea right now.
      
        $ sudo perf record --setup-filter pin
      
      The above command would pin BPF program and maps for the filter when the
      system has BPF-fs (usually at /sys/fs/bpf/).  To unpin the objects,
      users can run the following command (as root).
      
        $ sudo perf record --setup-filter unpin
      
      Committer testing:
      
        root@number:~# perf record --setup-filter pin
        root@number:~# ls -la /sys/fs/bpf/perf_filter/
        total 0
        drwxr-xr-x. 2 root root 0 Jul 31 10:43 .
        drwxr-xr-t. 3 root root 0 Jul 31 10:43 ..
        -rw-rw-rw-. 1 root root 0 Jul 31 10:43 dropped
        -rw-rw-rw-. 1 root root 0 Jul 31 10:43 filters
        -rwxrwxrwx. 1 root root 0 Jul 31 10:43 perf_sample_filter
        -rw-rw-rw-. 1 root root 0 Jul 31 10:43 pid_hash
        -rw-------. 1 root root 0 Jul 31 10:43 sample_f_rodata
        root@number:~# ls -la /sys/fs/bpf/perf_filter/perf_sample_filter
        -rwxrwxrwx. 1 root root 0 Jul 31 10:43 /sys/fs/bpf/perf_filter/perf_sample_filter
        root@number:~#
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-8-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      3dee4b83
    • Namhyung Kim's avatar
      perf record: Fix a potential error handling issue · 73bf63a4
      Namhyung Kim authored
      The evlist is allocated at the beginning of cmd_record().  Also free-ing
      thread masks should be paired with record__init_thread_masks() which is
      called right before __cmd_record().
      
      Let's change the order of these functions to release the resources
      correctly in case of errors.  This is maybe fine as the process exits,
      but it might be a problem if it manages some system-wide resources that
      live longer than the process.
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-7-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      73bf63a4
    • Namhyung Kim's avatar
      perf bpf-filter: Support separate lost counts for each filter · 1ec6fd34
      Namhyung Kim authored
      As the BPF filter is shared between other processes, it should have its
      own counter for each invocation.  Add a new array map (lost_count) to
      save the count using the same index as the filter.  It should clear the
      count before running the filter.
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-6-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1ec6fd34
    • Namhyung Kim's avatar
      perf bpf-filter: Support pin/unpin BPF object · 0715f65e
      Namhyung Kim authored
      And use the pinned objects for unprivileged users to profile their own
      tasks.  The BPF objects need to be pinned in the BPF-fs by root first
      and it'll be handled in the later 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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-5-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0715f65e
    • Namhyung Kim's avatar
      perf bpf-filter: Split per-task filter use case · eb1693b1
      Namhyung Kim authored
      If the target is a list of tasks, it can use a shared hash map for
      filter expressions.  The key of the filter map is an integer index like
      in an array.  A separate pid_hash map is added to get the index for the
      filter map using the tgid.
      
      For system-wide mode including per-cpu or per-user targets are handled
      by the single entry map like before.
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-4-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      eb1693b1
    • Namhyung Kim's avatar
      perf bpf-filter: Pass 'target' to perf_bpf_filter__prepare() · 966854e7
      Namhyung Kim authored
      This is needed to prepare target-specific actions in the later patch.
      We want to reuse the pinned BPF program and map for regular users to
      profile their own processes.
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-3-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      966854e7
    • Namhyung Kim's avatar
      perf bpf-filter: Make filters map a single entry hashmap · edb08cdd
      Namhyung Kim authored
      And the value is now an array.  This is to support multiple filter
      entries in the map later.
      
      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: KP Singh <kpsingh@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Song Liu <song@kernel.org>
      Cc: Stephane Eranian <eranian@google.com>
      Cc: bpf@vger.kernel.org
      Link: https://lore.kernel.org/r/20240703223035.2024586-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      edb08cdd
    • Ian Rogers's avatar
      perf jevents: Use name for special find value (PMU_EVENTS__NOT_FOUND) · 0f2c0400
      Ian Rogers authored
      -1000 was used as a special value added in Commit 3d504549 ("perf
      pmu-events: Add pmu_events_table__find_event()") to show that 1 table
      lacked a PMU/event but that didn't terminate the search in other
      tables.
      
      Add a new constant PMU_EVENTS__NOT_FOUND for this value and use it.
      Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
      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: Ingo Molnar <mingo@redhat.com>
      Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Oliver Sang <oliver.sang@intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Philip Li <philip.li@intel.com>
      Cc: Sandipan Das <sandipan.das@amd.com>
      Cc: Weilin Wang <weilin.wang@intel.com>
      Cc: Xu Yang <xu.yang_2@nxp.com>
      Link: https://lore.kernel.org/r/20240730191744.3097329-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0f2c0400
    • Tiezhu Yang's avatar
      perf list: Give clues if failed to open tracing events directory · b48543c4
      Tiezhu Yang authored
      When executing the command "perf list", I met "Error: failed to open
      tracing events directory" twice, the first reason is that there is no
      "/sys/kernel/tracing/events" directory due to it does not enable the
      kernel tracing infrastructure with CONFIG_FTRACE, the second reason
      is that there is no root privileges.
      
      Add the error string to tell the users what happened and what should
      to do, and also call put_tracing_file() to free events_path a little
      later to avoid messy code in the error message.
      
      At the same time, just remove the redundant "/" of the file path in
      the function get_tracing_file(), otherwise it shows something like
      "/sys/kernel/tracing//events".
      
      Before:
      
        $ ./perf list
        Error: failed to open tracing events directory
      
      After:
      
      (1) Without CONFIG_FTRACE
      
        $ ./perf list
        Error: failed to open tracing events directory
        /sys/kernel/tracing/events: No such file or directory
      
      (2) With CONFIG_FTRACE but no root privileges
      
        $ ./perf list
        Error: failed to open tracing events directory
        /sys/kernel/tracing/events: Permission denied
      
      Committer testing:
      
      Redirect stdout to null to quickly test the patch:
      
      Before:
      
        $ perf list > /dev/null
        Error: failed to open tracing events directory
        $
      
      After:
      
        $ perf list > /dev/null
        Error: failed to open tracing events directory
        /sys/kernel/tracing/events: Permission denied
        $
      Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/lkml/20240730062301.23244-3-yangtiezhu@loongson.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      b48543c4
    • Tiezhu Yang's avatar
      perf tools: Fix wrong message when running "make JOBS=1" · 839b1832
      Tiezhu Yang authored
      There is only one job when running "make JOBS=1", it should
      print "sequential build" rather than "parallel build".
      
      Before:
      
      $ cd tools/perf && make JOBS=1
        BUILD:   Doing 'make -j1' parallel build
      
      After:
      
      $ cd tools/perf && make JOBS=1
        BUILD:   Doing 'make -j1' sequential build
      Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/lkml/20240730062301.23244-2-yangtiezhu@loongson.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      839b1832
    • Charlie Jenkins's avatar
      libperf: Add gitignore · d261f9eb
      Charlie Jenkins authored
      Ignore files that are generated by libperf and libperf tests.
      Signed-off-by: default avatarCharlie Jenkins <charlie@rivosinc.com>
      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/lkml/20240729-libperf_gitignore-v1-1-1c70dd98edf9@rivosinc.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      d261f9eb
    • Leo Yan's avatar
      perf arm-spe: Support multiple Arm SPE events · 1635bdca
      Leo Yan authored
      As the flag 'auxtrace' has been set for Arm SPE events, now it is ready
      to use evsel__is_aux_event() to check if an event is AUX trace event or
      not. Use this function to replace the old checking for only the first
      Arm SPE event.
      Signed-off-by: default avatarLeo Yan <leo.yan@arm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: James Clark <james.clark@linaro.org>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc:  <coresight@lists.linaro.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc:  <linux-perf-users@vger.kernel.org>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1635bdca
    • Leo Yan's avatar
      perf arm-spe: Extract evsel setting up · ccd6fcda
      Leo Yan authored
      The evsel for Arm SPE PMU needs to be set up. Extract the setting up
      into a function arm_spe_setup_evsel().
      Signed-off-by: default avatarLeo Yan <leo.yan@arm.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: James Clark <james.clark@linaro.org>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc:  <coresight@lists.linaro.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc:  <linux-perf-users@vger.kernel.org>
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ccd6fcda
  2. 31 Jul, 2024 26 commits
    • Weilin Wang's avatar
      perf test: make metric validation test return early when there is no metric... · 4ed0f392
      Weilin Wang authored
      perf test: make metric validation test return early when there is no metric supported on the test system
      
      Add a check to return the metric validation test early when perf list metric
      does not output any metric. This would happen when NO_JEVENTS=1 is set or in a
      system that there is no metric supported.
      Signed-off-by: default avatarWeilin Wang <weilin.wang@intel.com>
      Tested-by: default avatarIan Rogers <irogers@google.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Caleb Biggers <caleb.biggers@intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Perry Taylor <perry.taylor@intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Samantha Alt <samantha.alt@intel.com>
      Link: https://lore.kernel.org/lkml/20240522204254.1841420-1-weilin.wang@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      4ed0f392
    • Namhyung Kim's avatar
      perf ftrace profile: Add -s/--sort option · 74ae366c
      Namhyung Kim authored
      The -s/--sort option is to sort the output by given column.
      
        $ sudo perf ftrace profile -s max sync | head
        # Total (us)   Avg (us)   Max (us)      Count   Function
            6301.811   6301.811   6301.811          1   __do_sys_sync
            6301.328   6301.328   6301.328          1   ksys_sync
            5320.300   1773.433   2858.819          3   iterate_supers
            2755.875     17.012   2610.633        162   sync_fs_one_sb
            2728.351    682.088   2610.413          4   ext4_sync_fs [ext4]
            2603.654   2603.654   2603.654          1   jbd2_log_wait_commit [jbd2]
            4750.615    593.827   2597.427          8   schedule
            2164.986     26.728   2115.673         81   sync_inodes_one_sb
            2143.842     26.467   2115.438         81   sync_inodes_sb
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Changbin Du <changbin.du@gmail.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Link: https://lore.kernel.org/lkml/20240729004127.238611-5-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      74ae366c
    • Namhyung Kim's avatar
      perf ftrace: Add 'profile' command · 0f223813
      Namhyung Kim authored
      The 'perf ftrace profile' command is to get function execution profiles
      using function-graph tracer so that users can see the total, average,
      max execution time as well as the number of invocations easily.
      
      The following is a profile for the perf_event_open syscall.
      
        $ sudo perf ftrace profile -G __x64_sys_perf_event_open -- \
          perf stat -e cycles -C1 true 2> /dev/null | head
        # Total (us)   Avg (us)   Max (us)      Count   Function
              65.611     65.611     65.611          1   __x64_sys_perf_event_open
              30.527     30.527     30.527          1   anon_inode_getfile
              30.260     30.260     30.260          1   __anon_inode_getfile
              29.700     29.700     29.700          1   alloc_file_pseudo
              17.578     17.578     17.578          1   d_alloc_pseudo
              17.382     17.382     17.382          1   __d_alloc
              16.738     16.738     16.738          1   kmem_cache_alloc_lru
              15.686     15.686     15.686          1   perf_event_alloc
              14.012      7.006     11.264          2   obj_cgroup_charge
        #
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Changbin Du <changbin.du@gmail.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Link: https://lore.kernel.org/lkml/20240729004127.238611-4-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0f223813
    • Namhyung Kim's avatar
      perf ftrace: Factor out check_ftrace_capable() · 608585f4
      Namhyung Kim authored
      The check is a common part of the ftrace commands, let's move it out.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Changbin Du <changbin.du@gmail.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Link: https://lore.kernel.org/lkml/20240729004127.238611-3-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      608585f4
    • Namhyung Kim's avatar
      perf ftrace: Add 'tail' option to --graph-opts · c7780089
      Namhyung Kim authored
      The 'graph-tail' option is to print function name as a comment at the end.
      This is useful when a large function is mixed with other functions
      (possibly from different CPUs).
      
      For example,
      
        $ sudo perf ftrace -- perf stat true
        ...
         1)               |    get_unused_fd_flags() {
         1)               |      alloc_fd() {
         1)   0.178 us    |        _raw_spin_lock();
         1)   0.187 us    |        expand_files();
         1)   0.169 us    |        _raw_spin_unlock();
         1)   1.211 us    |      }
         1)   1.503 us    |    }
      
        $ sudo perf ftrace --graph-opts tail -- perf stat true
        ...
         1)               |    get_unused_fd_flags() {
         1)               |      alloc_fd() {
         1)   0.099 us    |        _raw_spin_lock();
         1)   0.083 us    |        expand_files();
         1)   0.081 us    |        _raw_spin_unlock();
         1)   0.601 us    |      } /* alloc_fd */
         1)   0.751 us    |    } /* get_unused_fd_flags */
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Changbin Du <changbin.du@gmail.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
      Link: https://lore.kernel.org/lkml/20240729004127.238611-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c7780089
    • Dr. David Alan Gilbert's avatar
      perf test pmu: Remove unused test_pmus · 156e8dcf
      Dr. David Alan Gilbert authored
      Commit aa1551f2 ("perf test pmu: Refactor format test and exposed
      test APIs") added the 'test_pmus' list, but didn't use it.
      (It seems to put them on the other_pmus list?)
      
      Remove it.
      
      Fixes: aa1551f2 ("perf test pmu: Refactor format test and exposed test APIs")
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarDr. David Alan Gilbert <linux@treblig.org>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Link: https://lore.kernel.org/lkml/20240727175919.1041468-1-linux@treblig.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      156e8dcf
    • Adrian Hunter's avatar
      perf tools: Enable evsel__is_aux_event() to work for S390_CPUMSF · feab89bf
      Adrian Hunter authored
      evsel__is_aux_event() identifies AUX area tracing selected events.
      
      S390_CPUMSF uses a raw event type (PERF_TYPE_RAW - refer
      s390_cpumsf_evsel_is_auxtrace()) not a PMU type value that could be checked
      in evsel__is_aux_event(). However it sets needs_auxtrace_mmap (refer
      auxtrace_record__init()), so check that first.
      
      Currently, the features that use evsel__is_aux_event() are used only by
      Intel PT, but that may change in the future.
      Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
      Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Heiko Carstens <hca@linux.ibm.com>
      Cc: Hendrik Brueckner <brueckner@linux.ibm.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Jonathan Cameron <jonathan.cameron@huawei.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Richter <tmricht@linux.ibm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yicong Yang <yangyicong@hisilicon.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20240715160712.127117-7-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      feab89bf
    • Adrian Hunter's avatar
      perf tools: Enable evsel__is_aux_event() to work for ARM/ARM64 · c91928a8
      Adrian Hunter authored
      Set pmu->auxtrace on ARM/ARM64 AUX area PMUs. evsel__is_aux_event() needs
      the setting to identify AUX area tracing selected events.
      
      Currently, the features that use evsel__is_aux_event() are used only by
      Intel PT, but that may change in the future.
      Reviewed-by: default avatarAndi Kleen <ak@linux.intel.com>
      Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Acked-by: default avatarIan Rogers <irogers@google.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Heiko Carstens <hca@linux.ibm.com>
      Cc: Hendrik Brueckner <brueckner@linux.ibm.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Jonathan Cameron <jonathan.cameron@huawei.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Thomas Richter <tmricht@linux.ibm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: Yicong Yang <yangyicong@hisilicon.com>
      Cc: coresight@lists.linaro.org
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20240715160712.127117-6-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c91928a8
    • James Clark's avatar
      perf scripts python cs-etm: Restore first sample log in verbose mode · ae8e4f40
      James Clark authored
      The linked commit moved the early return on the first sample to before
      the verbose log, so move the log earlier too. Now the first sample is
      also logged and not skipped.
      
      Fixes: 2d98dbb4 ("perf scripts python arm-cs-trace-disasm.py: Do not ignore disam first sample")
      Reviewed-by: default avatarLeo Yan <leo.yan@arm.com>
      Signed-off-by: default avatarJames Clark <james.clark@linaro.org>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Benjamin Gray <bgray@linux.ibm.com>
      Cc: coresight@lists.linaro.org
      Cc: gankulkarni@os.amperecomputing.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: Mike Leach <mike.leach@linaro.org>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ruidong Tian <tianruidong@linux.alibaba.com>
      Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
      Link: https://lore.kernel.org/r/20240723132858.12747-1-james.clark@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ae8e4f40
    • James Clark's avatar
      perf cs-etm: Output 0 instead of 0xdeadbeef when exception packets are flushed · 41947446
      James Clark authored
      Normally exception packets don't directly output a branch sample, but
      if they're the last record in a buffer then they will. Because they
      don't have addresses set we'll see the placeholder value
      CS_ETM_INVAL_ADDR (0xdeadbeef) in the output.
      
      Since commit 6035b680 ("perf cs-etm: Support dummy address value for
      CS_ETM_TRACE_ON packet") we've used 0 as an externally visible "not set"
      address value. For consistency reasons and to not make exceptions look
      like an error, change them to use 0 too.
      
      This is particularly visible when doing userspace only tracing because
      trace is disabled when jumping to the kernel, causing the flush and then
      forcing the last exception packet to be emitted as a branch. With kernel
      trace included, there is no flush so exception packets don't generate
      samples until the next range packet and they'll pick up the correct
      address.
      
      Before:
      
        $ perf record -e cs_etm//u -- stress -i 1 -t 1
        $ perf script -F comm,ip,addr,flags
      
        stress   syscall                    ffffb7eedbc0 => deadbeefdeadbeef
        stress   syscall                    ffffb7f14a14 => deadbeefdeadbeef
        stress   syscall                    ffffb7eedbc0 => deadbeefdeadbeef
      
      After:
      
        stress   syscall                    ffffb7eedbc0 =>                0
        stress   syscall                    ffffb7f14a14 =>                0
        stress   syscall                    ffffb7eedbc0 =>                0
      Reviewed-by: default avatarMike Leach <mike.leach@linaro.org>
      Signed-off-by: default avatarJames Clark <james.clark@linaro.org>
      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: James Clark <james.clark@arm.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: John Garry <john.g.garry@oracle.com>
      Cc: Leo Yan <leo.yan@arm.com>
      Cc: Leo Yan <leo.yan@linux.dev>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: coresight@lists.linaro.org
      Cc: gankulkarni@os.amperecomputing.com
      Cc: linux-arm-kernel@lists.infradead.org
      Link: https://lore.kernel.org/r/20240722152756.59453-2-james.clark@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      41947446
    • Chen Ni's avatar
      perf inject: Convert comma to semicolon · 496cae1b
      Chen Ni authored
      Replace a comma between expression statements by a semicolon.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarChen Ni <nichen@iscas.ac.cn>
      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: Kan Liang <kan.liang@linux.intel.com>
      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/20240716075347.969041-1-nichen@iscas.ac.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      496cae1b
    • Chen Ni's avatar
      perf daemon: Convert comma to semicolon · e60fc19e
      Chen Ni authored
      Replace a comma between expression statements by a semicolon.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarChen Ni <nichen@iscas.ac.cn>
      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: Kan Liang <kan.liang@linux.intel.com>
      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/20240716074340.968909-1-nichen@iscas.ac.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      e60fc19e
    • Chen Ni's avatar
      perf annotate: Convert comma to semicolon · 050f2a03
      Chen Ni authored
      Replace a comma between expression statements by a semicolon.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarChen Ni <nichen@iscas.ac.cn>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Pekka Enberg <penberg@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20240716073405.968801-1-nichen@iscas.ac.cnSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      050f2a03
    • Kajol Jain's avatar
      perf vendor events power10: Update JSON/events · 42d37fc0
      Kajol Jain authored
      Update JSON/events for power10 platform with additional events.
      
      Also move PM_VECTOR_LD_CMPL event from others.json to frontend.json
      file.
      Reviewed-by: default avatarIan Rogers <irogers@google.com>
      Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Tested-by: default avatarDisha Goel <disgoel@linux.ibm.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: hbathini@linux.ibm.com
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: https://lore.kernel.org/r/20240723052154.96202-1-kjain@linux.ibm.com
      [ Remove alternative to ' char that made the build break in some distros with a unicode parsing python error ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      42d37fc0
    • Athira Rajeev's avatar
      perf annotate: Set instruction name to be used with insn-stat when using raw instruction · 2c9db747
      Athira Rajeev authored
      Since the "ins.name" is not set while using raw instruction,
      'perf annotate' with insn-stat gives wrong data:
      
      Result from "./perf annotate --data-type --insn-stat":
      
        Annotate Instruction stats
        total 615, ok 419 (68.1%), bad 196 (31.9%)
      
          Name      :  Good   Bad
          -----------------------------------------------------------
                    :   419   196
      
      This patch sets "dl->ins.name" in arch specific function
      "check_ppc_insn" while initialising "struct disasm_line".
      
      Also update "ins_find" function to pass "struct disasm_line" as a
      parameter so as to set its name field in arch specific call.
      
      With the patch changes:
      
        Annotate Instruction stats
        total 609, ok 446 (73.2%), bad 163 (26.8%)
      
        Name/opcode         :  Good   Bad
        -----------------------------------------------------------
        58                  :   323    80
        32                  :    49    43
        34                  :    33    11
        OP_31_XOP_LDX       :     8    20
        40                  :    23     0
        OP_31_XOP_LWARX     :     5     1
        OP_31_XOP_LWZX      :     2     3
        OP_31_XOP_LDARX     :     3     0
        33                  :     0     2
        OP_31_XOP_LBZX      :     0     1
        OP_31_XOP_LWAX      :     0     1
        OP_31_XOP_LHZX      :     0     1
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-16-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      2c9db747
    • Athira Rajeev's avatar
      perf annotate: Add support to use libcapstone in powerpc · c5d60de1
      Athira Rajeev authored
      Now perf uses the capstone library to disassemble the instructions in
      x86. capstone is used (if available) for perf annotate to speed up.
      
      Currently it only supports x86 architecture.
      
      This patch includes changes to enable this in powerpc.
      
      For now, only for data type sort keys, this method is used and only
      binary code (raw instruction) is read. This is because powerpc approach
      to understand instructions and reg fields uses raw instruction.
      
      The "cs_disasm" is currently not enabled. While attempting to do
      cs_disasm, observation is that some of the instructions were not
      identified (ex: extswsli, maddld) and it had to fallback to use objdump.
      
      Hence enabling "cs_disasm" is added in comment section as a TODO for
      powerpc.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-15-atrajeev@linux.vnet.ibm.com
      [ Use dso__nsinfo(dso) as required to match EXTRA_CFLAGS=-DREFCNT_CHECKING=1 build expectations ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      c5d60de1
    • Athira Rajeev's avatar
      perf annotate: Use capstone_init and remove open_capstone_handle from disasm.c · f1e9347c
      Athira Rajeev authored
      capstone_init is made availbale for all archs to use and updated to
      enable support for CS_ARCH_PPC as well. Patch removes
      open_capstone_handle and uses capstone_init in all the places.
      
      Committer notes:
      
      Avoid including capstone/capstone.h from print_insn.h to not break the
      build in builtin-script.c due to the namespace clash with libbpf:
      
        /usr/include/capstone/bpf.h:94:14: error: 'bpf_insn' defined as wrong kind of tag
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-14-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      f1e9347c
    • Athira Rajeev's avatar
      perf annotate: Make capstone_init non-static so that it can be used during symbol disassemble · 1fe86bc2
      Athira Rajeev authored
      symbol__disassemble_capstone in util/disasm.c calls function
      open_capstone_handle to open/init the capstone.
      
      We already have a capstone_init function in "util/print_insn.c". But
      capstone_init is defined as a static function in util/print_insn.c.
      
      Change this and also add the function in print_insn.h
      
      The open_capstone_handle checks the disassembler_style option from
      annotation_options to decide whether to set CS_OPT_SYNTAX_ATT.
      
      Add that logic in capstone_init also and by default set it to true.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-13-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1fe86bc2
    • Athira Rajeev's avatar
      perf annotate: Update instruction tracking for powerpc · 88444952
      Athira Rajeev authored
      Add instruction tracking function "update_insn_state_powerpc" for
      powerpc. Example sequence in powerpc:
      
        ld      r10,264(r3)
        mr      r31,r3
        <<after some sequence>
        ld      r9,312(r31)
      
      Consider ithe sample is pointing to: "ld r9,312(r31)".
      
      Here the memory reference is hit at "312(r31)" where 312 is the offset
      and r31 is the source register.
      
      Previous instruction sequence shows that register state of r3 is moved
      to r31.
      
      So to identify the data type for r31 access, the previous instruction
      ("mr") needs to be tracked and the state type entry has to be updated.
      
      Current instruction tracking support in perf tools infrastructure is
      specific to x86. Patch adds this support for powerpc as well.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-12-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      88444952
    • Athira Rajeev's avatar
      perf annotate: Add more instructions for instruction tracking · 539bfea3
      Athira Rajeev authored
      Add few more instructions and use opcode as search key
      to find if it is supported by the architecture.
      
      The added ones are: addi, addic, addic., addis, subfic and mulli
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-11-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      539bfea3
    • Athira Rajeev's avatar
      perf annotate: Add some of the arithmetic instructions to support instruction tracking in powerpc · cd0b6f67
      Athira Rajeev authored
      Data-type profiling has the concept of instruction tracking.
      
      Example sequence in powerpc:
      
      	ld      r10,264(r3)
      	mr      r31,r3
      	<<after some sequence>
      	ld      r9,312(r31)
      
      or differently
      
      	lwz	r10,264(r3)
      	add	r31, r3, RB
      	lwz	r9, 0(r31)
      
      If a sample is hit at "lwz r9, 0(r31)", data type of r31 depends
      on previous instruction sequence here. So to track the previous
      instructions, patch adds changes to identify some of the arithmetic
      instructions which are having opcode as 31.
      
      Since memory instructions also has cases with opcode 31, use the bits
      22:30 to filter the arithmetic instructions here.
      
      Also there are instructions with just two operands like "addme", "addze".
      
      This patch adds new instructions ops "arithmetic_ops" to handle this
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-10-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      cd0b6f67
    • Athira Rajeev's avatar
      perf annotate: Add support to identify memory instructions of opcode 31 in powerpc · ace7d681
      Athira Rajeev authored
      There are memory instructions in powerpc with opcode as 31.
      Example: "ldx RT,RA,RB" , Its X form is as below:
      
        ______________________________________
        | 31 |  RT  |  RA |  RB |   21     |/|
        --------------------------------------
        0    6     11    16    21         30 31
      
      The opcode for "ldx" is 31. There are other instructions also with
      opcode 31 which are memory insn like ldux, stbx, lwzx, lhaux
      But all instructions with opcode 31 are not memory. Example is add
      instruction: "add RT,RA,RB"
      
      The value in bit 21-30 [ 21 for ldx ] is different for these
      instructions. Patch uses this value to assign instruction ops for these
      cases. The naming convention and value to identify these are picked from
      defines in "arch/powerpc/include/asm/ppc-opcode.h"
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-9-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      ace7d681
    • Athira Rajeev's avatar
      perf annotate: Add parse function for memory instructions in powerpc · 1acdad68
      Athira Rajeev authored
      Use the raw instruction code and macros to identify memory instructions,
      extract register fields and also offset.
      
      The implementation addresses the D-form, X-form, DS-form instructions.
      Two main functions are added.
      
      New parse function "load_store__parse" as instruction ops parser for
      memory instructions.
      
      Unlike other parsers (like mov__parse), this one fills in the
      "multi_regs" field for source/target and new added "mem_ref" field. No
      other fields are set because, here there is no need to parse the
      disassembled code and arch specific macros will take care of extracting
      offset and regs which is easier and will be precise.
      
      In powerpc, all instructions with a primary opcode from 32 to 63
      are memory instructions. Update "ins__find" function to have "raw_insn"
      also as a parameter.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-8-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1acdad68
    • Athira Rajeev's avatar
      perf annotate: Update parameters for reg extract functions to use raw instruction on powerpc · 1b4406d2
      Athira Rajeev authored
      Use the raw instruction code and macros to identify memory instructions,
      extract register fields and also offset.
      
      The implementation addresses the D-form, X-form, DS-form instructions.
      
      Adds "mem_ref" field to check whether source/target has memory
      reference.
      
      Add function "get_powerpc_regs" which will set these fields: reg1, reg2,
      offset depending of where it is source or target ops.
      
      Update "parse" callback for "struct ins_ops" to also pass "struct
      disasm_line" as argument. This is needed in parse functions where opcode
      is used to determine whether to set multi_regs and other fields
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-7-atrajeev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      1b4406d2
    • Athira Rajeev's avatar
      perf annotate: Add support to capture and parse raw instruction in powerpc... · 0b971e6b
      Athira Rajeev authored
      perf annotate: Add support to capture and parse raw instruction in powerpc using dso__data_read_offset utility
      
      Add support to capture and parse raw instruction in powerpc.
      Currently, the perf tool infrastructure uses two ways to disassemble
      and understand the instruction. One is objdump and other option is
      via libcapstone.
      
      Currently, the perf tool infrastructure uses "--no-show-raw-insn" option
      with "objdump" while disassemble. Example from powerpc with this option
      for an instruction address is:
      
      Snippet from:
      
        objdump  --start-address=<address> --stop-address=<address>  -d --no-show-raw-insn -C <vmlinux>
      
        c0000000010224b4:	lwz     r10,0(r9)
      
      This line "lwz r10,0(r9)" is parsed to extract instruction name,
      registers names and offset. Also to find whether there is a memory
      reference in the operands, "memory_ref_char" field of objdump is used.
      For x86, "(" is used as memory_ref_char to tackle instructions of the
      form "mov  (%rax), %rcx".
      
      In case of powerpc, not all instructions using "(" are the only memory
      instructions. Example, above instruction can also be of extended form (X
      form) "lwzx r10,0,r19". Inorder to easy identify the instruction category
      and extract the source/target registers, patch adds support to use raw
      instruction for powerpc. Approach used is to read the raw instruction
      directly from the DSO file using "dso__data_read_offset" utility which
      is already implemented in perf infrastructure in "util/dso.c".
      
      Example:
      
      38 01 81 e8     ld      r4,312(r1)
      
      Here "38 01 81 e8" is the raw instruction representation. In powerpc,
      this translates to instruction form: "ld RT,DS(RA)" and binary code
      as:
      
         | 58 |  RT  |  RA |      DS       | |
         -------------------------------------
         0    6     11    16              30 31
      
      Function "symbol__disassemble_dso" is updated to read raw instruction
      directly from DSO using dso__data_read_offset utility. In case of
      above example, this captures:
      line:    38 01 81 e8
      
      The above works well when 'perf report' is invoked with only sort keys
      for data type ie type and typeoff.
      
      Because there is no instruction level annotation needed if only data
      type information is requested for.
      
      For annotating sample, along with type and typeoff sort key, "sym" sort
      key is also needed. And by default invoking just "perf report" uses sort
      key "sym" that displays the symbol information.
      
      With approach changes in powerpc which first reads DSO for raw
      instruction, "perf annotate" and "perf report" + a key breaks since
      it doesn't do the instruction level disassembly.
      
      Snippet of result from 'perf report':
      
        Samples: 1K of event 'mem-loads', 4000 Hz, Event count (approx.): 937238
        do_work  /usr/bin/pmlogger [Percent: local period]
        Percent│        ea230010
               │        3a550010
               │        3a600000
      
               │        38f60001
               │        39490008
               │        42400438
         51.44 │        81290008
               │        7d485378
      
      Here, raw instruction is displayed in the output instead of human
      readable annotated form.
      
      One way to get the appropriate data is to specify "--objdump path", by
      which code annotation will be done. But the default behaviour will be
      changed. To fix this breakage, check if "sym" sort key is set. If so
      fallback and use the libcapstone/objdump way of disassmbling the sample.
      
      With the changes and "perf report"
      
      Samples: 1K of event 'mem-loads', 4000 Hz, Event count (approx.): 937238
      do_work  /usr/bin/pmlogger [Percent: local period]
      Percent│        ld        r17,16(r3)
             │        addi      r18,r21,16
             │        li        r19,0
      
             │ 8b0:   rldicl    r10,r10,63,33
             │        addi      r10,r10,1
             │        mtctr     r10
             │      ↓ b         8e4
             │ 8c0:   addi      r7,r22,1
             │        addi      r10,r9,8
             │      ↓ bdz       d00
       51.44 │        lwz       r9,8(r9)
             │        mr        r8,r10
             │        cmpw      r20,r9
      
      Committer notes:
      
      Just add the extern for 'sort_order' in disasm.c so that we don't end up
      breaking the build due to this type colision with capstone and libbpf:
      
        In file included from /usr/include/capstone/capstone.h:325,
                         from /git/perf-6.10.0/tools/perf/util/print_insn.h:23,
                         from builtin-script.c:38:
        /usr/include/capstone/bpf.h:94:14: error: 'bpf_insn' defined as wrong kind of tag
           94 | typedef enum bpf_insn {
      
      I reported this to the bpf mailing list, see one of the links below.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-6-atrajeev@linux.vnet.ibm.com
      Link: https://lore.kernel.org/bpf/ZqOltPk9VQGgJZAA@x1/T/#uSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      0b971e6b
    • Athira Rajeev's avatar
      perf annotate: Add disasm_line__parse() to parse raw instruction for powerpc · 06dd4c5a
      Athira Rajeev authored
      Currently, the perf tool infrastructure uses the disasm_line__parse
      function to parse disassembled line.
      
      Example snippet from objdump:
      
        objdump  --start-address=<address> --stop-address=<address>  -d --no-show-raw-insn -C <vmlinux>
      
        c0000000010224b4:	lwz     r10,0(r9)
      
      This line "lwz r10,0(r9)" is parsed to extract instruction name,
      registers names and offset.
      
      In powerpc, the approach for data type profiling uses raw instruction
      instead of result from objdump to identify the instruction category and
      extract the source/target registers.
      
      Example: 38 01 81 e8     ld      r4,312(r1)
      
      Here "38 01 81 e8" is the raw instruction representation. Add function
      "disasm_line__parse_powerpc" to handle parsing of raw instruction.
      Also update "struct disasm_line" to save the binary code/
      With the change, function captures:
      
      line -> "38 01 81 e8     ld      r4,312(r1)"
      raw instruction "38 01 81 e8"
      
      Raw instruction is used later to extract the reg/offset fields. Macros
      are added to extract opcode and register fields. "struct disasm_line"
      is updated to carry union of "bytes" and "raw_insn" of 32 bit to carry raw
      code (raw).
      
      Function "disasm_line__parse_powerpc fills the raw instruction hex value
      and can use macros to get opcode. There is no changes in existing code
      paths, which parses the disassembled code.  The size of raw instruction
      depends on architecture.
      
      In case of powerpc, the parsing the disasm line needs to handle cases
      for reading binary code directly from DSO as well as parsing the objdump
      result. Hence adding the logic into separate function instead of
      updating "disasm_line__parse".  The architecture using the instruction
      name and present approach is not altered. Since this approach targets
      powerpc, the macro implementation is added for powerpc as of now.
      
      Since the disasm_line__parse is used in other cases (perf annotate) and
      not only data tye profiling, the powerpc callback includes changes to
      work with binary code as well as mnemonic representation.
      
      Also in case if the DSO read fails and libcapstone is not supported, the
      approach fallback to use objdump as option. Hence as option, patch has
      changes to ensure objdump option also works well.
      Reviewed-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
      Tested-by: default avatarKajol Jain <kjain@linux.ibm.com>
      Cc: Adrian Hunter <adrian.hunter@intel.com>
      Cc: Akanksha J N <akanksha@linux.ibm.com>
      Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
      Cc: Disha Goel <disgoel@linux.vnet.ibm.com>
      Cc: Hari Bathini <hbathini@linux.ibm.com>
      Cc: Ian Rogers <irogers@google.com>
      Cc: Jiri Olsa <jolsa@kernel.org>
      Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
      Cc: Segher Boessenkool <segher@kernel.crashing.org>
      Link: https://lore.kernel.org/lkml/20240718084358.72242-5-atrajeev@linux.vnet.ibm.com
      [ Add check for strndup() result ]
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      06dd4c5a