perf pmus: Simplify perf_pmus__find_core_pmu()
authorJames Clark <james.clark@arm.com>
Wed, 13 Sep 2023 15:33:49 +0000 (16:33 +0100)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 15 Sep 2023 23:46:40 +0000 (16:46 -0700)
Currently the while loop always either exits on the first iteration with
a core PMU, or exits with NULL on heterogeneous systems or when not all
CPUs are online.

Both of the latter behaviors are undesirable for platforms other than
Arm so simplify it to always return the first core PMU, or NULL if none
exist.

This behavior was depended on by the Arm version of
pmu_metrics_table__find(), so the logic has been moved there instead.

Signed-off-by: James Clark <james.clark@arm.com>
Suggested-by: Ian Rogers <irogers@google.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Eduard Zingerman <eddyz87@gmail.com>
Cc: Will Deacon <will@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
Cc: Haixin Yu <yuhaixin.yhx@linux.alibaba.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20230913153355.138331-3-james.clark@arm.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/arch/arm64/util/pmu.c
tools/perf/util/pmus.c

index 3d9330feebd28fcc9d495ee6f24672784f5287d0..3099f5f448ba2934478385fcc9a999c326d6c096 100644 (file)
 
 const struct pmu_metrics_table *pmu_metrics_table__find(void)
 {
-       struct perf_pmu *pmu = perf_pmus__find_core_pmu();
+       struct perf_pmu *pmu;
+
+       /* Metrics aren't currently supported on heterogeneous Arm systems */
+       if (perf_pmus__num_core_pmus() > 1)
+               return NULL;
 
+       /* Doesn't matter which one here because they'll all be the same */
+       pmu = perf_pmus__find_core_pmu();
        if (pmu)
                return perf_pmu__find_metrics_table(pmu);
 
index cec869cbe163a0ca12990171adbd802f40be14f6..64e798e68a2db338500afa6feaa52bdb4ffc7bb5 100644 (file)
@@ -596,17 +596,5 @@ struct perf_pmu *evsel__find_pmu(const struct evsel *evsel)
 
 struct perf_pmu *perf_pmus__find_core_pmu(void)
 {
-       struct perf_pmu *pmu = NULL;
-
-       while ((pmu = perf_pmus__scan_core(pmu))) {
-               /*
-                * The cpumap should cover all CPUs. Otherwise, some CPUs may
-                * not support some events or have different event IDs.
-                */
-               if (RC_CHK_ACCESS(pmu->cpus)->nr != cpu__max_cpu().cpu)
-                       return NULL;
-
-               return pmu;
-       }
-       return NULL;
+       return perf_pmus__scan_core(NULL);
 }