perf arm-spe: Introduce arm_spe__is_homogeneous()
authorLeo Yan <leo.yan@arm.com>
Thu, 3 Oct 2024 18:53:18 +0000 (19:53 +0100)
committerNamhyung Kim <namhyung@kernel.org>
Mon, 14 Oct 2024 19:04:31 +0000 (12:04 -0700)
Introduce the arm_spe__is_homogeneous() function, it uses to check if
Arm SPE is homogeneous cross all CPUs.

Signed-off-by: Leo Yan <leo.yan@arm.com>
Reviewed-by: James Clark <james.clark@linaro.org>
Link: https://lore.kernel.org/r/20241003185322.192357-4-leo.yan@arm.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/arm-spe.c

index b0e9eb6057c3b4f830e9a5eb4bbdd42eb0bcdb8c..587943b6bdb80c694b5c7afc74a3fd24b4de0c3e 100644 (file)
@@ -82,6 +82,7 @@ struct arm_spe {
        u64                             **metadata;
        u64                             metadata_ver;
        u64                             metadata_nr_cpu;
+       bool                            is_homogeneous;
 };
 
 struct arm_spe_queue {
@@ -1374,6 +1375,30 @@ synth_instructions_out:
        return 0;
 }
 
+static bool arm_spe__is_homogeneous(u64 **metadata, int nr_cpu)
+{
+       u64 midr;
+       int i;
+
+       if (!nr_cpu)
+               return false;
+
+       for (i = 0; i < nr_cpu; i++) {
+               if (!metadata[i])
+                       return false;
+
+               if (i == 0) {
+                       midr = metadata[i][ARM_SPE_CPU_MIDR];
+                       continue;
+               }
+
+               if (midr != metadata[i][ARM_SPE_CPU_MIDR])
+                       return false;
+       }
+
+       return true;
+}
+
 int arm_spe_process_auxtrace_info(union perf_event *event,
                                  struct perf_session *session)
 {
@@ -1419,6 +1444,7 @@ int arm_spe_process_auxtrace_info(union perf_event *event,
        spe->metadata = metadata;
        spe->metadata_ver = metadata_ver;
        spe->metadata_nr_cpu = nr_cpu;
+       spe->is_homogeneous = arm_spe__is_homogeneous(metadata, nr_cpu);
 
        spe->timeless_decoding = arm_spe__is_timeless_decoding(spe);