OSDN Git Service

perf tools: Check if mem_events is supported for hybrid platform
authorJin Yao <yao.jin@linux.intel.com>
Thu, 27 May 2021 00:16:06 +0000 (08:16 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 1 Jun 2021 14:04:33 +0000 (11:04 -0300)
Check if the mem_events ('mem-loads' and 'mem-stores') exist
in the sysfs path.

For Alderlake, the hybrid cpu pmu are "cpu_core" and "cpu_atom".
Check the existing of following paths:

/sys/devices/cpu_atom/events/mem-loads
/sys/devices/cpu_atom/events/mem-stores
/sys/devices/cpu_core/events/mem-loads
/sys/devices/cpu_core/events/mem-stores

If the patch exists, the mem_event is supported.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210527001610.10553-5-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/mem-events.c

index c736ead..69dcac7 100644 (file)
@@ -12,6 +12,8 @@
 #include "mem-events.h"
 #include "debug.h"
 #include "symbol.h"
+#include "pmu.h"
+#include "pmu-hybrid.h"
 
 unsigned int perf_mem_events__loads_ldlat = 30;
 
@@ -100,6 +102,15 @@ int perf_mem_events__parse(const char *str)
        return -1;
 }
 
+static bool perf_mem_event__supported(const char *mnt, char *sysfs_name)
+{
+       char path[PATH_MAX];
+       struct stat st;
+
+       scnprintf(path, PATH_MAX, "%s/devices/%s", mnt, sysfs_name);
+       return !stat(path, &st);
+}
+
 int perf_mem_events__init(void)
 {
        const char *mnt = sysfs__mount();
@@ -110,9 +121,9 @@ int perf_mem_events__init(void)
                return -ENOENT;
 
        for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
-               char path[PATH_MAX];
                struct perf_mem_event *e = perf_mem_events__ptr(j);
-               struct stat st;
+               struct perf_pmu *pmu;
+               char sysfs_name[100];
 
                /*
                 * If the event entry isn't valid, skip initialization
@@ -121,11 +132,20 @@ int perf_mem_events__init(void)
                if (!e->tag)
                        continue;
 
-               scnprintf(path, PATH_MAX, "%s/devices/%s",
-                         mnt, e->sysfs_name);
+               if (!perf_pmu__has_hybrid()) {
+                       scnprintf(sysfs_name, sizeof(sysfs_name),
+                                 e->sysfs_name, "cpu");
+                       e->supported = perf_mem_event__supported(mnt, sysfs_name);
+               } else {
+                       perf_pmu__for_each_hybrid_pmu(pmu) {
+                               scnprintf(sysfs_name, sizeof(sysfs_name),
+                                         e->sysfs_name, pmu->name);
+                               e->supported |= perf_mem_event__supported(mnt, sysfs_name);
+                       }
+               }
 
-               if (!stat(path, &st))
-                       e->supported = found = true;
+               if (e->supported)
+                       found = true;
        }
 
        return found ? 0 : -ENOENT;