• Ian Rogers's avatar
    perf parse-events: Sort and group parsed events · 347c2f0a
    Ian Rogers authored
    This change is intended to be a no-op for most current cases, the
    default sort order is the order the events were parsed. Where it
    varies is in how groups are handled. Previously an uncore and core
    event that are grouped would most often cause the group to be removed:
    
    ```
    $ perf stat -e '{instructions,uncore_imc_free_running_0/data_total/}' -a sleep 1
    WARNING: grouped events cpus do not match, disabling group:
      anon group { instructions, uncore_imc_free_running_0/data_total/ }
    ...
    ```
    
    However, when wildcards are used the events should be re-sorted and
    re-grouped in parse_events__set_leader, but this currently fails for
    simple examples:
    
    ```
    $ perf stat -e '{uncore_imc_free_running/data_read/,uncore_imc_free_running/data_write/}' -a sleep 1
    
     Performance counter stats for 'system wide':
    
         <not counted> MiB  uncore_imc_free_running/data_read/
         <not counted> MiB  uncore_imc_free_running/data_write/
    
           1.000996992 seconds time elapsed
    ```
    
    A futher failure mode, fixed in this patch, is to force topdown events
    into a group.
    
    This change moves sorting the evsels in the evlist after parsing. It
    requires parsing to set up groups. First the evsels are sorted
    respecting the existing groupings and parse order, but also reordering
    to ensure evsels of the same PMU and group appear together. So that
    software and aux events respect groups, their pmu_name is taken from
    the group leader. The sorting is done with list_sort removing a memory
    allocation.
    
    After sorting a pass is done to correct the group leaders and for
    topdown events ensuring they have a group leader.
    
    This fixes the problems seen before:
    
    ```
    $ perf stat -e '{uncore_imc_free_running/data_read/,uncore_imc_free_running/data_write/}' -a sleep 1
    
     Performance counter stats for 'system wide':
    
                727.42 MiB  uncore_imc_free_running/data_read/
                 81.84 MiB  uncore_imc_free_running/data_write/
    
           1.000948615 seconds time elapsed
    ```
    
    As well as making groups not fail for cases like:
    
    ```
    $ perf stat -e '{imc_free_running_0/data_total/,imc_free_running_1/data_total/}' -a sleep 1
    
     Performance counter stats for 'system wide':
    
                256.47 MiB  imc_free_running_0/data_total/
                256.48 MiB  imc_free_running_1/data_total/
    
           1.001165442 seconds time elapsed
    ```
    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: Florian Fischer <florian.fischer@muhq.space>
    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: Kajol Jain <kjain@linux.ibm.com>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Kim Phillips <kim.phillips@amd.com>
    Cc: Leo Yan <leo.yan@linaro.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: Sean Christopherson <seanjc@google.com>
    Cc: Steinar H. Gunderson <sesse@google.com>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
    Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
    Link: https://lore.kernel.org/r/20230312021543.3060328-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    347c2f0a
parse-events.c 68.2 KB