mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
A single fix for the x86 performance counters on Intel CPUs:
The MSR offset calculations for fixed performance counters are stored at the wrong index in the configuration array causing the general purpose counter MSR offset to be overwritten, so both the general purpose and the fixed counters offsets are incorrect. Correct the array index calculation to fix that. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmhFOSQTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoSGFD/0WsH6ri5lu7ClOvZY0/IynV8mWsqmZ PHEzdU+htBMPnOKQAlhPvy91G8yLHlIkyATup0t3P4uRzWu0hHShuZvl30HL8pg2 XlbPgGS3ZPekRLH1V3R+xCFVucs6IYv3Et/slbt8gWYjgXD82jZYbJRZSfYhGGKI kKpHPi+zsFLGeel2RUunUCqAM04Z2+/p2sIbFmYfSHtsi422dOsqjIsZQfYUO+hD oDVyhAlpmGV5+kww/kOS7+9tneLVOhxFyPxBn/6f6gT4yKuqAoHkp82tMKvqkZPt xvx+ruajzZotaZiVJm4Wvi6rb9RPOKBy9EDvk77jeVmncescnShx6yRmdJLPT9DC VRjPikrWnTo8yg3N0N5QoAUEWuVOCHpSWR4dbVLiTNjHlQSr2n8hrI4I4L1AwLgJ r0HwKLXZzYzLI8YBmg1CD5V5gnW8eOE2R2yfzpxIiefyzZHJ4pAT5KgOTggT3c9X lyoqOSMwfmH2elh4quZbfOPg7/bWRxb1Cx6HLslySYPUudDSP/W/KEIKFsApEC/v u7okDC/EGbiyyfJxa7G9Hl66Aer74SWo/hRND6RqffNk3heQ3xvkpk7W4K/lJV3m OA5AXsDBx0IacoaINrZ5HX5PLS9VoKCiSJXG3k/LNV15rLB5Ohco+/mf6ce0gRG2 5p0JHuUlDc8PKA== =P3Rq -----END PGP SIGNATURE----- Merge tag 'perf-urgent-2025-06-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull x86 perf fix from Thomas Gleixner: "A single fix for the x86 performance counters on Intel CPUs: The MSR offset calculations for fixed performance counters are stored at the wrong index in the configuration array causing the general purpose counter MSR offset to be overwritten, so both the general purpose and the fixed counters offsets are incorrect. Correct the array index calculation to fix that" * tag 'perf-urgent-2025-06-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/x86/intel: Fix incorrect MSR index calculations in intel_pmu_config_acr()
This commit is contained in:
commit
d9864e7d15
|
|
@ -2900,6 +2900,7 @@ static void intel_pmu_config_acr(int idx, u64 mask, u32 reload)
|
|||
{
|
||||
struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
|
||||
int msr_b, msr_c;
|
||||
int msr_offset;
|
||||
|
||||
if (!mask && !cpuc->acr_cfg_b[idx])
|
||||
return;
|
||||
|
|
@ -2907,19 +2908,20 @@ static void intel_pmu_config_acr(int idx, u64 mask, u32 reload)
|
|||
if (idx < INTEL_PMC_IDX_FIXED) {
|
||||
msr_b = MSR_IA32_PMC_V6_GP0_CFG_B;
|
||||
msr_c = MSR_IA32_PMC_V6_GP0_CFG_C;
|
||||
msr_offset = x86_pmu.addr_offset(idx, false);
|
||||
} else {
|
||||
msr_b = MSR_IA32_PMC_V6_FX0_CFG_B;
|
||||
msr_c = MSR_IA32_PMC_V6_FX0_CFG_C;
|
||||
idx -= INTEL_PMC_IDX_FIXED;
|
||||
msr_offset = x86_pmu.addr_offset(idx - INTEL_PMC_IDX_FIXED, false);
|
||||
}
|
||||
|
||||
if (cpuc->acr_cfg_b[idx] != mask) {
|
||||
wrmsrl(msr_b + x86_pmu.addr_offset(idx, false), mask);
|
||||
wrmsrl(msr_b + msr_offset, mask);
|
||||
cpuc->acr_cfg_b[idx] = mask;
|
||||
}
|
||||
/* Only need to update the reload value when there is a valid config value. */
|
||||
if (mask && cpuc->acr_cfg_c[idx] != reload) {
|
||||
wrmsrl(msr_c + x86_pmu.addr_offset(idx, false), reload);
|
||||
wrmsrl(msr_c + msr_offset, reload);
|
||||
cpuc->acr_cfg_c[idx] = reload;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user