]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf: arm_pmuv3: Use BR_RETIRED for HW branch event if enabled
authorIlkka Koskinen <ilkka@os.amperecomputing.com>
Fri, 6 Sep 2024 19:15:39 +0000 (12:15 -0700)
committerWill Deacon <will@kernel.org>
Mon, 9 Sep 2024 14:28:02 +0000 (15:28 +0100)
The PMU driver attempts to use PC_WRITE_RETIRED for the HW branch event,
if enabled. However, PC_WRITE_RETIRED counts only taken branches,
whereas BR_RETIRED counts also non-taken ones.

Furthermore, perf uses HW branch event to calculate branch misses ratio,
implying BR_RETIRED is the correct event to count.

We keep PC_WRITE_RETIRED still as an option in case BR_RETIRED isn't
implemented.

Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Link: https://lore.kernel.org/r/20240906191539.4847-1-ilkka@os.amperecomputing.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/perf/arm_pmuv3.c

index 4d000532a07f186c463533ce909707541ecfecd0..0afe02f879b45a8600b9cea1bfd88e6a68096a67 100644 (file)
@@ -1086,14 +1086,14 @@ static int __armv8_pmuv3_map_event_id(struct arm_pmu *armpmu,
        if (event->attr.type == PERF_TYPE_HARDWARE &&
            event->attr.config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS) {
 
-               if (test_bit(ARMV8_PMUV3_PERFCTR_PC_WRITE_RETIRED,
-                            armpmu->pmceid_bitmap))
-                       return ARMV8_PMUV3_PERFCTR_PC_WRITE_RETIRED;
-
                if (test_bit(ARMV8_PMUV3_PERFCTR_BR_RETIRED,
                             armpmu->pmceid_bitmap))
                        return ARMV8_PMUV3_PERFCTR_BR_RETIRED;
 
+               if (test_bit(ARMV8_PMUV3_PERFCTR_PC_WRITE_RETIRED,
+                            armpmu->pmceid_bitmap))
+                       return ARMV8_PMUV3_PERFCTR_PC_WRITE_RETIRED;
+
                return HW_OP_UNSUPPORTED;
        }