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

perf mem: Clean up perf_mem_event__supported()

For some ARCHs, e.g., ARM and AMD, to get the availability of the
mem-events, perf checks the existence of a specific PMU. For the other
ARCHs, e.g., Intel and Power, perf has to check the existence of some
specific events.

The current perf only iterates the mem-events-supported PMUs. It's not
required to check the existence of a specific PMU anymore.

Rename sysfs_name to event_name, which stores the specific mem-events.
Perf only needs to check those events for the availability of the
mem-events.

Rename perf_mem_event__supported to perf_pmu__mem_events_supported.

Reviewed-by: Ian Rogers <irogers@google.com>
Tested-by: Ravi Bangoria <ravi.bangoria@amd.com>
Tested-by: Leo Yan <leo.yan@linaro.org>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Cc: james.clark@arm.com
Cc: will@kernel.org
Cc: mike.leach@linaro.org
Cc: renyu.zj@linux.alibaba.com
Cc: yuhaixin.yhx@linux.alibaba.com
Cc: tmricht@linux.ibm.com
Cc: atrajeev@linux.vnet.ibm.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: john.g.garry@oracle.com
Link: https://lore.kernel.org/r/20240123185036.3461837-5-kan.liang@linux.intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

Kan Liang and committed by
Namhyung Kim
db95c2ce abbdd79b

+31 -29
+4 -4
tools/perf/arch/arm64/util/mem-events.c
··· 3 3 #include "util/mem-events.h" 4 4 #include "mem-events.h" 5 5 6 - #define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a } 6 + #define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a } 7 7 8 8 struct perf_mem_event perf_mem_events_arm[PERF_MEM_EVENTS__MAX] = { 9 - E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=0,min_latency=%u/", "arm_spe_0", true, 0), 10 - E("spe-store", "%s/ts_enable=1,pa_enable=1,load_filter=0,store_filter=1/", "arm_spe_0", false, 0), 11 - E("spe-ldst", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=1,min_latency=%u/", "arm_spe_0", true, 0), 9 + E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=0,min_latency=%u/", NULL, true, 0), 10 + E("spe-store", "%s/ts_enable=1,pa_enable=1,load_filter=0,store_filter=1/", NULL, false, 0), 11 + E("spe-ldst", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=1,min_latency=%u/", NULL, true, 0), 12 12 };
+4 -4
tools/perf/arch/powerpc/util/mem-events.c
··· 3 3 #include "util/mem-events.h" 4 4 #include "mem-events.h" 5 5 6 - #define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a } 6 + #define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a } 7 7 8 8 struct perf_mem_event perf_mem_events_power[PERF_MEM_EVENTS__MAX] = { 9 - E("ldlat-loads", "%s/mem-loads/", "cpu/events/mem-loads", false, 0), 10 - E("ldlat-stores", "%s/mem-stores/", "cpu/events/mem-stores", false, 0), 11 - E(NULL, NULL, NULL, false, 0), 9 + E("ldlat-loads", "%s/mem-loads/", "mem-loads", false, 0), 10 + E("ldlat-stores", "%s/mem-stores/", "mem-stores", false, 0), 11 + E(NULL, NULL, NULL, false, 0), 12 12 };
+10 -10
tools/perf/arch/x86/util/mem-events.c
··· 9 9 10 10 #define MEM_LOADS_AUX 0x8203 11 11 12 - #define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a } 12 + #define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a } 13 13 14 14 struct perf_mem_event perf_mem_events_intel[PERF_MEM_EVENTS__MAX] = { 15 - E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "%s/events/mem-loads", true, 0), 16 - E("ldlat-stores", "%s/mem-stores/P", "%s/events/mem-stores", false, 0), 17 - E(NULL, NULL, NULL, false, 0), 15 + E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "mem-loads", true, 0), 16 + E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0), 17 + E(NULL, NULL, NULL, false, 0), 18 18 }; 19 19 20 20 struct perf_mem_event perf_mem_events_intel_aux[PERF_MEM_EVENTS__MAX] = { 21 - E("ldlat-loads", "{%s/mem-loads-aux/,%s/mem-loads,ldlat=%u/}:P", "%s/events/mem-loads", true, MEM_LOADS_AUX), 22 - E("ldlat-stores", "%s/mem-stores/P", "%s/events/mem-stores", false, 0), 23 - E(NULL, NULL, NULL, false, 0), 21 + E("ldlat-loads", "{%s/mem-loads-aux/,%s/mem-loads,ldlat=%u/}:P", "mem-loads", true, MEM_LOADS_AUX), 22 + E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0), 23 + E(NULL, NULL, NULL, false, 0), 24 24 }; 25 25 26 26 struct perf_mem_event perf_mem_events_amd[PERF_MEM_EVENTS__MAX] = { 27 - E(NULL, NULL, NULL, false, 0), 28 - E(NULL, NULL, NULL, false, 0), 29 - E("mem-ldst", "%s//", "ibs_op", false, 0), 27 + E(NULL, NULL, NULL, false, 0), 28 + E(NULL, NULL, NULL, false, 0), 29 + E("mem-ldst", "%s//", NULL, false, 0), 30 30 }; 31 31 32 32 bool is_mem_loads_aux_event(struct evsel *leader)
+12 -10
tools/perf/util/mem-events.c
··· 17 17 18 18 unsigned int perf_mem_events__loads_ldlat = 30; 19 19 20 - #define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a } 20 + #define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a } 21 21 22 22 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { 23 - E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "cpu/events/mem-loads", true, 0), 24 - E("ldlat-stores", "%s/mem-stores/P", "cpu/events/mem-stores", false, 0), 25 - E(NULL, NULL, NULL, false, 0), 23 + E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "mem-loads", true, 0), 24 + E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0), 25 + E(NULL, NULL, NULL, false, 0), 26 26 }; 27 27 #undef E 28 28 ··· 151 151 return -1; 152 152 } 153 153 154 - static bool perf_mem_event__supported(const char *mnt, struct perf_pmu *pmu, 154 + static bool perf_pmu__mem_events_supported(const char *mnt, struct perf_pmu *pmu, 155 155 struct perf_mem_event *e) 156 156 { 157 - char sysfs_name[100]; 158 157 char path[PATH_MAX]; 159 158 struct stat st; 160 159 161 - scnprintf(sysfs_name, sizeof(sysfs_name), e->sysfs_name, pmu->name); 162 - scnprintf(path, PATH_MAX, "%s/devices/%s", mnt, sysfs_name); 160 + if (!e->event_name) 161 + return true; 162 + 163 + scnprintf(path, PATH_MAX, "%s/devices/%s/events/%s", mnt, pmu->name, e->event_name); 164 + 163 165 return !stat(path, &st); 164 166 } 165 167 ··· 184 182 if (!e->tag) 185 183 continue; 186 184 187 - e->supported |= perf_mem_event__supported(mnt, pmu, e); 185 + e->supported |= perf_pmu__mem_events_supported(mnt, pmu, e); 188 186 if (e->supported) 189 187 found = true; 190 188 } ··· 236 234 } else { 237 235 const char *s = perf_pmu__mem_events_name(j, pmu); 238 236 239 - if (!perf_mem_event__supported(mnt, pmu, e)) 237 + if (!perf_pmu__mem_events_supported(mnt, pmu, e)) 240 238 continue; 241 239 242 240 rec_argv[i++] = "-e";
+1 -1
tools/perf/util/mem-events.h
··· 18 18 u32 aux_event; 19 19 const char *tag; 20 20 const char *name; 21 - const char *sysfs_name; 21 + const char *event_name; 22 22 }; 23 23 24 24 struct mem_info {