mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 23:51:39 +00:00
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>
This commit is contained in:
parent
abbdd79b78
commit
db95c2ce9b
@ -3,10 +3,10 @@
|
||||
#include "util/mem-events.h"
|
||||
#include "mem-events.h"
|
||||
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a }
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a }
|
||||
|
||||
struct perf_mem_event perf_mem_events_arm[PERF_MEM_EVENTS__MAX] = {
|
||||
E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=0,min_latency=%u/", "arm_spe_0", true, 0),
|
||||
E("spe-store", "%s/ts_enable=1,pa_enable=1,load_filter=0,store_filter=1/", "arm_spe_0", false, 0),
|
||||
E("spe-ldst", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=1,min_latency=%u/", "arm_spe_0", true, 0),
|
||||
E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=0,min_latency=%u/", NULL, true, 0),
|
||||
E("spe-store", "%s/ts_enable=1,pa_enable=1,load_filter=0,store_filter=1/", NULL, false, 0),
|
||||
E("spe-ldst", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=1,min_latency=%u/", NULL, true, 0),
|
||||
};
|
||||
|
@ -3,10 +3,10 @@
|
||||
#include "util/mem-events.h"
|
||||
#include "mem-events.h"
|
||||
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a }
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a }
|
||||
|
||||
struct perf_mem_event perf_mem_events_power[PERF_MEM_EVENTS__MAX] = {
|
||||
E("ldlat-loads", "%s/mem-loads/", "cpu/events/mem-loads", false, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/", "cpu/events/mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("ldlat-loads", "%s/mem-loads/", "mem-loads", false, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/", "mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
};
|
||||
|
@ -9,24 +9,24 @@
|
||||
|
||||
#define MEM_LOADS_AUX 0x8203
|
||||
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a }
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a }
|
||||
|
||||
struct perf_mem_event perf_mem_events_intel[PERF_MEM_EVENTS__MAX] = {
|
||||
E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "%s/events/mem-loads", true, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "%s/events/mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "mem-loads", true, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
};
|
||||
|
||||
struct perf_mem_event perf_mem_events_intel_aux[PERF_MEM_EVENTS__MAX] = {
|
||||
E("ldlat-loads", "{%s/mem-loads-aux/,%s/mem-loads,ldlat=%u/}:P", "%s/events/mem-loads", true, MEM_LOADS_AUX),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "%s/events/mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("ldlat-loads", "{%s/mem-loads-aux/,%s/mem-loads,ldlat=%u/}:P", "mem-loads", true, MEM_LOADS_AUX),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
};
|
||||
|
||||
struct perf_mem_event perf_mem_events_amd[PERF_MEM_EVENTS__MAX] = {
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("mem-ldst", "%s//", "ibs_op", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("mem-ldst", "%s//", NULL, false, 0),
|
||||
};
|
||||
|
||||
bool is_mem_loads_aux_event(struct evsel *leader)
|
||||
|
@ -17,12 +17,12 @@
|
||||
|
||||
unsigned int perf_mem_events__loads_ldlat = 30;
|
||||
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .sysfs_name = s, .ldlat = l, .aux_event = a }
|
||||
#define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a }
|
||||
|
||||
struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
|
||||
E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "cpu/events/mem-loads", true, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "cpu/events/mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
E("ldlat-loads", "%s/mem-loads,ldlat=%u/P", "mem-loads", true, 0),
|
||||
E("ldlat-stores", "%s/mem-stores/P", "mem-stores", false, 0),
|
||||
E(NULL, NULL, NULL, false, 0),
|
||||
};
|
||||
#undef E
|
||||
|
||||
@ -151,15 +151,17 @@ int perf_pmu__mem_events_parse(struct perf_pmu *pmu, const char *str)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static bool perf_mem_event__supported(const char *mnt, struct perf_pmu *pmu,
|
||||
static bool perf_pmu__mem_events_supported(const char *mnt, struct perf_pmu *pmu,
|
||||
struct perf_mem_event *e)
|
||||
{
|
||||
char sysfs_name[100];
|
||||
char path[PATH_MAX];
|
||||
struct stat st;
|
||||
|
||||
scnprintf(sysfs_name, sizeof(sysfs_name), e->sysfs_name, pmu->name);
|
||||
scnprintf(path, PATH_MAX, "%s/devices/%s", mnt, sysfs_name);
|
||||
if (!e->event_name)
|
||||
return true;
|
||||
|
||||
scnprintf(path, PATH_MAX, "%s/devices/%s/events/%s", mnt, pmu->name, e->event_name);
|
||||
|
||||
return !stat(path, &st);
|
||||
}
|
||||
|
||||
@ -182,7 +184,7 @@ int perf_pmu__mem_events_init(struct perf_pmu *pmu)
|
||||
if (!e->tag)
|
||||
continue;
|
||||
|
||||
e->supported |= perf_mem_event__supported(mnt, pmu, e);
|
||||
e->supported |= perf_pmu__mem_events_supported(mnt, pmu, e);
|
||||
if (e->supported)
|
||||
found = true;
|
||||
}
|
||||
@ -234,7 +236,7 @@ int perf_mem_events__record_args(const char **rec_argv, int *argv_nr,
|
||||
} else {
|
||||
const char *s = perf_pmu__mem_events_name(j, pmu);
|
||||
|
||||
if (!perf_mem_event__supported(mnt, pmu, e))
|
||||
if (!perf_pmu__mem_events_supported(mnt, pmu, e))
|
||||
continue;
|
||||
|
||||
rec_argv[i++] = "-e";
|
||||
|
@ -18,7 +18,7 @@ struct perf_mem_event {
|
||||
u32 aux_event;
|
||||
const char *tag;
|
||||
const char *name;
|
||||
const char *sysfs_name;
|
||||
const char *event_name;
|
||||
};
|
||||
|
||||
struct mem_info {
|
||||
|
Loading…
Reference in New Issue
Block a user