]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Apply TSX_CTRL_CPUID_CLEAR if and only if the vCPU has RTM or HLE
authorSean Christopherson <seanjc@google.com>
Wed, 11 Dec 2024 01:33:00 +0000 (17:33 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 12 Feb 2025 18:16:31 +0000 (10:16 -0800)
When emulating CPUID, retrieve MSR_IA32_TSX_CTRL.TSX_CTRL_CPUID_CLEAR if
and only if RTM and/or HLE feature bits need to be cleared.  Getting the
MSR value is unnecessary if neither bit is set, and avoiding the lookup
saves ~80 cycles for vCPUs without RTM or HLE.

Cc: Jim Mattson <jmattson@google.com>
Reviewed-by: Jim Mattson <jmattson@google.com>
Link: https://lore.kernel.org/r/20241211013302.1347853-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/cpuid.c

index a57fa0123c773aededeb7c6a55ef0bc44d5a90db..0de3f581ef1247b8a9949df772be376c9d8610f0 100644 (file)
@@ -1999,7 +1999,8 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
                *edx = entry->edx;
                if (function == 7 && index == 0) {
                        u64 data;
-                       if (!__kvm_get_msr(vcpu, MSR_IA32_TSX_CTRL, &data, true) &&
+                       if ((*ebx & (feature_bit(RTM) | feature_bit(HLE))) &&
+                           !__kvm_get_msr(vcpu, MSR_IA32_TSX_CTRL, &data, true) &&
                            (data & TSX_CTRL_CPUID_CLEAR))
                                *ebx &= ~(feature_bit(RTM) | feature_bit(HLE));
                } else if (function == 0x80000007) {