]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Remove the unreachable case for 0x80000022 leaf in __do_cpuid_func()
authorXiaoyao Li <xiaoyao.li@intel.com>
Tue, 4 Mar 2025 08:23:13 +0000 (03:23 -0500)
committerSean Christopherson <seanjc@google.com>
Tue, 4 Mar 2025 17:19:49 +0000 (09:19 -0800)
Remove dead/unreachable (and misguided) code in KVM's processing of
0x80000022.  The case statement breaks early if PERFMON_V2 isnt supported,
i.e. kvm_cpu_cap_has(X86_FEATURE_PERFMON_V2) must be true when KVM reaches
the code code to setup EBX.

Note, early versions of the patch that became commit 94cdeebd8211 ("KVM:
x86/cpuid: Add AMD CPUID ExtPerfMonAndDbg leaf 0x80000022") didn't break
early on lack of PERFMON_V2 support, and instead enumerated the effective
number of counters KVM could emulate.  All of that code was flawed, e.g.
the APM explicitly states EBX is valid only for v2.

  Performance Monitoring Version 2 supported. When set,
  CPUID_Fn8000_0022_EBX reports the number of available performance counters.

When the flaw of not respecting v2 support was addressed, the misguided
stuffing of the number of counters got left behind.

Link: https://lore.kernel.org/all/20220919093453.71737-4-likexu@tencent.com
Fixes: 94cdeebd8211 ("KVM: x86/cpuid: Add AMD CPUID ExtPerfMonAndDbg leaf 0x80000022")
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
Link: https://lore.kernel.org/r/20250304082314.472202-2-xiaoyao.li@intel.com
[sean: elaborate on the situation a bit more, add Fixes]
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/cpuid.c

index 97a90689a9dcc58c1bca5d941faa2c363877dd50..668e8fac1f6eacb24bd6ca3a5b7f399c8aeae763 100644 (file)
@@ -1773,13 +1773,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
 
                cpuid_entry_override(entry, CPUID_8000_0022_EAX);
 
-               if (kvm_cpu_cap_has(X86_FEATURE_PERFMON_V2))
-                       ebx.split.num_core_pmc = kvm_pmu_cap.num_counters_gp;
-               else if (kvm_cpu_cap_has(X86_FEATURE_PERFCTR_CORE))
-                       ebx.split.num_core_pmc = AMD64_NUM_COUNTERS_CORE;
-               else
-                       ebx.split.num_core_pmc = AMD64_NUM_COUNTERS;
-
+               ebx.split.num_core_pmc = kvm_pmu_cap.num_counters_gp;
                entry->ebx = ebx.full;
                break;
        }