Skip to content

Commit 7fa981c

Browse files
Kan LiangPeter Zijlstra
authored andcommitted
perf/x86/intel: Add a quirk for the calculation of the number of counters on Alder Lake
For some Alder Lake machine with all E-cores disabled in a BIOS, the below warning may be triggered. [ 2.010766] hw perf events fixed 5 > max(4), clipping! Current perf code relies on the CPUID leaf 0xA and leaf 7.EDX[15] to calculate the number of the counters and follow the below assumption. For a hybrid configuration, the leaf 7.EDX[15] (X86_FEATURE_HYBRID_CPU) is set. The leaf 0xA only enumerate the common counters. Linux perf has to manually add the extra GP counters and fixed counters for P-cores. For a non-hybrid configuration, the X86_FEATURE_HYBRID_CPU should not be set. The leaf 0xA enumerates all counters. However, that's not the case when all E-cores are disabled in a BIOS. Although there are only P-cores in the system, the leaf 7.EDX[15] (X86_FEATURE_HYBRID_CPU) is still set. But the leaf 0xA is updated to enumerate all counters of P-cores. The inconsistency triggers the warning. Several software ways were considered to handle the inconsistency. - Drop the leaf 0xA and leaf 7.EDX[15] CPUID enumeration support. Hardcode the number of counters. This solution may be a problem for virtualization. A hypervisor cannot control the number of counters in a Linux guest via changing the guest CPUID enumeration anymore. - Find another CPUID bit that is also updated with E-cores disabled. There may be a problem in the virtualization environment too. Because a hypervisor may disable the feature/CPUID bit. - The P-cores have a maximum of 8 GP counters and 4 fixed counters on ADL. The maximum number can be used to detect the case. This solution is implemented in this patch. Fixes: ee72a94 ("perf/x86/intel: Fix fixed counter check warning for some Alder Lake") Reported-by: Damjan Marion (damarion) <[email protected]> Reported-by: Chan Edison <[email protected]> Signed-off-by: Kan Liang <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Tested-by: Damjan Marion (damarion) <[email protected]> Cc: [email protected] Link: https://lkml.kernel.org/r/[email protected]
1 parent 09f5e7d commit 7fa981c

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

arch/x86/events/intel/core.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6236,6 +6236,19 @@ __init int intel_pmu_init(void)
62366236
pmu->num_counters = x86_pmu.num_counters;
62376237
pmu->num_counters_fixed = x86_pmu.num_counters_fixed;
62386238
}
6239+
6240+
/*
6241+
* Quirk: For some Alder Lake machine, when all E-cores are disabled in
6242+
* a BIOS, the leaf 0xA will enumerate all counters of P-cores. However,
6243+
* the X86_FEATURE_HYBRID_CPU is still set. The above codes will
6244+
* mistakenly add extra counters for P-cores. Correct the number of
6245+
* counters here.
6246+
*/
6247+
if ((pmu->num_counters > 8) || (pmu->num_counters_fixed > 4)) {
6248+
pmu->num_counters = x86_pmu.num_counters;
6249+
pmu->num_counters_fixed = x86_pmu.num_counters_fixed;
6250+
}
6251+
62396252
pmu->max_pebs_events = min_t(unsigned, MAX_PEBS_EVENTS, pmu->num_counters);
62406253
pmu->unconstrained = (struct event_constraint)
62416254
__EVENT_CONSTRAINT(0, (1ULL << pmu->num_counters) - 1,

0 commit comments

Comments
 (0)