diff mbox series

arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1

Message ID 20220617111332.203061-1-alexandru.elisei@arm.com (mailing list archive)
State New, archived
Headers show
Series arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1 | expand

Commit Message

Alexandru Elisei June 17, 2022, 11:13 a.m. UTC
Commit b20d1ba3cf4b ("arm64: cpufeature: allow for version discrepancy in
PMU implementations") made it possible to run Linux on a machine with PMUs
with different versions without tainting the kernel. The patch relaxed the
restriction only for the ID_AA64DFR0_EL1.PMUVer field, and missed doing the
same for ID_DFR0_EL1.PerfMon , which also reports the PMU version, but for
the AArch32 state.

For example, with Linux running on two clusters with different PMU
versions, the kernel is tainted when bringing up secondaries with the
following message:

[    0.097027] smp: Bringing up secondary CPUs ...
[..]
[    0.142805] Detected PIPT I-cache on CPU4
[    0.142805] CPU features: SANITY CHECK: Unexpected variation in SYS_ID_DFR0_EL1. Boot CPU: 0x00000004011088, CPU4: 0x00000005011088
[    0.143555] CPU features: Unsupported CPU feature variation detected.
[    0.143702] GICv3: CPU4: found redistributor 10000 region 0:0x000000002f180000
[    0.143702] GICv3: CPU4: using allocated LPI pending table @0x00000008800d0000
[    0.144888] CPU4: Booted secondary processor 0x0000010000 [0x410fd0f0]

The boot CPU implements FEAT_PMUv3p1 (ID_DFR0_EL1.PerfMon, bits 27:24, is
0b0100), but CPU4, part of the other cluster, implements FEAT_PMUv3p4
(ID_DFR0_EL1.PerfMon = 0b0101).

Treat the PerfMon field as FTR_NONSTRICT and FTR_EXACT to pass the sanity
check and to match how PMUVer is treated for the 64bit ID register.

Fixes: b20d1ba3cf4b ("arm64: cpufeature: allow for version discrepancy in PMU implementations")
Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
---
Discovered on Fixed Virtual Platforms, configured with:

cluster0.NUM_CORES=4
cluster0.has_arm_v8-1=1
cluster0.has_arm_v8-2=1

cluster1.NUM_CORES=4
cluster1.has_arm_v8-1=1
cluster1.has_arm_v8-2=1
cluster1.has_v8_4_pmu_extension=2

 arch/arm64/kernel/cpufeature.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Will Deacon June 23, 2022, 7:31 p.m. UTC | #1
On Fri, 17 Jun 2022 12:13:32 +0100, Alexandru Elisei wrote:
> Commit b20d1ba3cf4b ("arm64: cpufeature: allow for version discrepancy in
> PMU implementations") made it possible to run Linux on a machine with PMUs
> with different versions without tainting the kernel. The patch relaxed the
> restriction only for the ID_AA64DFR0_EL1.PMUVer field, and missed doing the
> same for ID_DFR0_EL1.PerfMon , which also reports the PMU version, but for
> the AArch32 state.
> 
> [...]

Applied to will (for-next/perf), thanks!

[1/1] arm64: cpufeature: Allow different PMU versions in ID_DFR0_EL1
      https://git.kernel.org/will/c/506506cad394

Cheers,
diff mbox series

Patch

diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index 42ea2bd856c6..371416ab9c30 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -561,7 +561,7 @@  static const struct arm64_ftr_bits ftr_id_pfr2[] = {
 
 static const struct arm64_ftr_bits ftr_id_dfr0[] = {
 	/* [31:28] TraceFilt */
-	S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_PERFMON_SHIFT, 4, 0xf),
+	S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_EXACT, ID_DFR0_PERFMON_SHIFT, 4, 0),
 	ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MPROFDBG_SHIFT, 4, 0),
 	ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_MMAPTRC_SHIFT, 4, 0),
 	ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_DFR0_COPTRC_SHIFT, 4, 0),