]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
powerpc/perf: Exclude pmc5/6 from the irrelevant PMU group constraints
authorAthira Rajeev <atrajeev@linux.vnet.ibm.com>
Mon, 21 Sep 2020 07:10:04 +0000 (03:10 -0400)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 6 Oct 2020 12:22:27 +0000 (23:22 +1100)
PMU counter support functions enforces event constraints for group of
events to check if all events in a group can be monitored. Incase of
event codes using PMC5 and PMC6 ( 500fa and 600f4 respectively ), not
all constraints are applicable, say the threshold or sample bits. But
current code includes pmc5 and pmc6 in some group constraints (like
IC_DC Qualifier bits) which is actually not applicable and hence
results in those events not getting counted when scheduled along with
group of other events. Patch fixes this by excluding PMC5/6 from
constraints which are not relevant for it.

Fixes: 7ffd948 ("powerpc/perf: factor out power8 pmu functions")
Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Reviewed-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1600672204-1610-1-git-send-email-atrajeev@linux.vnet.ibm.com
arch/powerpc/perf/isa207-common.c

index 964437adec1852df1d27230292072554ed66eac2..2848904df63832c06dd8d167bd5680990144684e 100644 (file)
@@ -288,6 +288,15 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
 
                mask  |= CNST_PMC_MASK(pmc);
                value |= CNST_PMC_VAL(pmc);
+
+               /*
+                * PMC5 and PMC6 are used to count cycles and instructions and
+                * they do not support most of the constraint bits. Add a check
+                * to exclude PMC5/6 from most of the constraints except for
+                * EBB/BHRB.
+                */
+               if (pmc >= 5)
+                       goto ebb_bhrb;
        }
 
        if (pmc <= 4) {
@@ -357,6 +366,7 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
                }
        }
 
+ebb_bhrb:
        if (!pmc && ebb)
                /* EBB events must specify the PMC */
                return -1;