• Kan Liang's avatar
    perf env: Find correct branch counter info on hybrid · edf3ce0e
    Kan Liang authored
    No event is printed in the "Branch Counter" column on hybrid machines.
    
    For example,
    
      $ perf record -e "{cpu_core/branch-instructions/pp,cpu_core/branches/}:S" -j any,counter
      $ perf report --total-cycles
    
      # Branch counter abbr list:
      # cpu_core/branch-instructions/pp = A
      # cpu_core/branches/ = B
      # '-' No event occurs
      # '+' Event occurrences may be lost due to branch counter saturated
      #
      # Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles  Branch Counter
      # ...............  ..............  ...........  ..........  ..............
                44.54%          727.1K        0.00%           1   |+   |+   |
                36.31%          592.7K        0.00%           2   |+   |+   |
                17.83%          291.1K        0.00%           1   |+   |+   |
    
    The branch counter information (br_cntr_width and br_cntr_nr) in the
    perf_env is retrieved from the CPU_PMU_CAPS. However, the CPU_PMU_CAPS
    is not available on hybrid machines. Without the width information, the
    number of occurrences of an event cannot be calculated.
    
    For a hybrid machine, the caps information should be retrieved from the
    PMU_CAPS, and stored in the perf_env->pmu_caps.
    
    Add a perf_env__find_br_cntr_info() to return the correct branch counter
    information from the corresponding fields.
    
    Committer notes:
    
    While testing I couldn't s ee those "Branch counter" columns enabled by
    pressing 'B' on the TUI, after reporting it to the list Kan explained
    the situation:
    
    <quote Kan Liang>
    For a hybrid client, the "Branch Counter" feature is only supported
    starting from the just released Lunar Lake. Perf falls back to only
    "ANY" on your Raptor Lake.
    
    The "The branch counter is not available" message is expected.
    
    Here is the 'perf evlist' result from my Lunar Lake machine,
    
      # perf evlist -v
      cpu_core/branch-instructions/pp: type: 4 (cpu_core), size: 136, config: 0xc4 (branch-instructions), { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|READ|PERIOD|BRANCH_STACK|IDENTIFIER, read_format: ID|GROUP|LOST, disabled: 1, freq: 1, enable_on_exec: 1, precise_ip: 2, sample_id_all: 1, exclude_guest: 1, branch_sample_type: ANY|COUNTERS
      #
    </quote>
    
    Fixes: 6f9d8d1d ("perf script: Add branch counters")
    Reviewed-by: default avatarIan Rogers <irogers@google.com>
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kan Liang <kan.liang@linux.intel.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https://lore.kernel.org/r/20240909184201.553519-1-kan.liang@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    edf3ce0e
session.c 72.3 KB