Re: [PATCH v4 12/15] perf arm_spe: Improve CPU number retrieving in per-thread mode
From: James Clark <james.clark@linaro.org>
Date: 2025-09-11 16:08:42
Also in:
linux-perf-users
On 31/07/2025 2:25 pm, Leo Yan wrote:
quoted hunk ↗ jump to hunk
In per-thread mode on a homogeneous system, the current code simply picks the first metadata entry for data source parsing. This change improves that by using the PMU type to find the matching PMU event. From there, it reads the CPU map and uses the first CPU ID to fetch the metadata. Although this makes no difference when there's only one Arm SPE PMU, it helps for future support of multiple SPE events. Signed-off-by: Leo Yan <leo.yan@arm.com> --- tools/perf/util/arm-spe.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c index db681dd2aed205655e77f3dfcd7eb3c33f20277a..2ac10b8008527a066c9b2f67a22eb8511af9239a 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c@@ -914,6 +914,9 @@ static bool arm_spe__synth_ds(struct arm_spe_queue *speq, union perf_mem_data_src *data_src) { struct arm_spe *spe = speq->spe; + struct perf_cpu_map *cpus; + struct perf_cpu perf_cpu; + int16_t cpu_nr; u64 *metadata = NULL; u64 midr; unsigned int i;@@ -935,13 +938,21 @@ static bool arm_spe__synth_ds(struct arm_spe_queue *speq, if (!spe->is_homogeneous) return false; - /* In homogeneous system, simply use CPU0's metadata */ - if (spe->metadata) - metadata = spe->metadata[0]; + cpus = perf_pmus__find_by_type(spe->pmu_type)->cpus;
You can't run perf_pmus__find_by_type() at this point because we're decoding and might not even be running on the same system or even architecture. If we've already determined that it's homogeneous I don't think this is much of an improvement anwyay. Looks like handling multiple SPE instances needs a lot more work than this. We should skip doing it in this patchset and do it properly on its own later.
+ if (!cpus)
+ return false;
+
+ /* In a homogeneous system, fetch the first CPU in the map. */
+ perf_cpu = perf_cpu_map__cpu(cpus, 0);
+ if (perf_cpu.cpu == -1)
+ return false;
+
+ cpu_nr = perf_cpu.cpu;
} else {
- metadata = arm_spe__get_metadata_by_cpu(spe, speq->cpu);
+ cpu_nr = speq->cpu;
}
+ metadata = arm_spe__get_metadata_by_cpu(spe, cpu_nr);
if (!metadata)
return false;