Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Use pmus to describe type from attribute

When dumping a perf_event_attr, use pmus to find the PMU and its name
by the type number. This allows dynamically added PMUs to be described.

Before:

$ perf stat -vv -e data_read true
...
perf_event_attr:
type 24
size 136
config 0x20ff
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
exclude_guest 1
...

After:

$ perf stat -vv -e data_read true
...
perf_event_attr:
type 24 (uncore_imc_free_running_0)
size 136
config 0x20ff
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
exclude_guest 1
...

However, it also means that when we have a PMU name we prefer it to a
hard coded name:

Before:

$ perf stat -vv -e faults true
...
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
config 0x2 (PERF_COUNT_SW_PAGE_FAULTS)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
enable_on_exec 1
exclude_guest 1
...

After:

$ perf stat -vv -e faults true
...
perf_event_attr:
type 1 (software)
size 136
config 0x2 (PERF_COUNT_SW_PAGE_FAULTS)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
enable_on_exec 1
exclude_guest 1
...

It feels more consistent to do this, rather than only prefer a PMU
name when a hard coded name isn't available.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Kan 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-6-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
70938820 4ccf3bb7

+11 -5
+11 -5
tools/perf/util/perf_event_attr_fprintf.c
··· 7 7 #include <linux/types.h> 8 8 #include <linux/perf_event.h> 9 9 #include "util/evsel_fprintf.h" 10 + #include "util/pmu.h" 11 + #include "util/pmus.h" 10 12 #include "trace-event.h" 11 13 12 14 struct bit_names { ··· 77 75 } 78 76 79 77 #define ENUM_ID_TO_STR_CASE(x) case x: return (#x); 80 - static const char *stringify_perf_type_id(u64 value) 78 + static const char *stringify_perf_type_id(struct perf_pmu *pmu, u32 type) 81 79 { 82 - switch (value) { 80 + if (pmu) 81 + return pmu->name; 82 + 83 + switch (type) { 83 84 ENUM_ID_TO_STR_CASE(PERF_TYPE_HARDWARE) 84 85 ENUM_ID_TO_STR_CASE(PERF_TYPE_SOFTWARE) 85 86 ENUM_ID_TO_STR_CASE(PERF_TYPE_TRACEPOINT) ··· 180 175 #define print_id_unsigned(_s) PRINT_ID(_s, "%"PRIu64) 181 176 #define print_id_hex(_s) PRINT_ID(_s, "%#"PRIx64) 182 177 183 - static void __p_type_id(char *buf, size_t size, u64 value) 178 + static void __p_type_id(struct perf_pmu *pmu, char *buf, size_t size, u64 value) 184 179 { 185 - print_id_unsigned(stringify_perf_type_id(value)); 180 + print_id_unsigned(stringify_perf_type_id(pmu, value)); 186 181 } 187 182 188 183 static void __p_config_hw_id(char *buf, size_t size, u64 value) ··· 251 246 #define p_sample_type(val) __p_sample_type(buf, BUF_SIZE, val) 252 247 #define p_branch_sample_type(val) __p_branch_sample_type(buf, BUF_SIZE, val) 253 248 #define p_read_format(val) __p_read_format(buf, BUF_SIZE, val) 254 - #define p_type_id(val) __p_type_id(buf, BUF_SIZE, val) 249 + #define p_type_id(val) __p_type_id(pmu, buf, BUF_SIZE, val) 255 250 #define p_config_id(val) __p_config_id(buf, BUF_SIZE, attr->type, val) 256 251 257 252 #define PRINT_ATTRn(_n, _f, _p, _a) \ ··· 267 262 int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr, 268 263 attr__fprintf_f attr__fprintf, void *priv) 269 264 { 265 + struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type); 270 266 char buf[BUF_SIZE]; 271 267 int ret = 0; 272 268