Message ID | 20241128013424.4096668-2-seanjc@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | KVM: x86: CPUID overhaul, fixes, and caching | expand |
Sean Christopherson <seanjc@google.com> writes: > When clearing CONSTANT_TSC during CPUID emulation due to a Hyper-V quirk, > use feature_bit() instead of SF() to ensure the bit is actually cleared. > SF() evaluates to zero if the _host_ doesn't support the feature. I.e. > KVM could keep the bit set if userspace advertised CONSTANT_TSC despite > it not being supported in hardware. FWIW, I would strongly discourage such setups, all sorts of weird hangs will likely be observed with Windows guests if TSC rate actually changes. > > Note, translating from a scattered feature to a the hardware version is > done by __feature_translate(), not SF(). The sole purpose of SF() is to > check kernel support for the scattered feature, *before* translation. > > Cc: Vitaly Kuznetsov <vkuznets@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > arch/x86/kvm/cpuid.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c > index 097bdc022d0f..776f24408fa3 100644 > --- a/arch/x86/kvm/cpuid.c > +++ b/arch/x86/kvm/cpuid.c > @@ -1630,7 +1630,7 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, > *ebx &= ~(F(RTM) | F(HLE)); > } else if (function == 0x80000007) { > if (kvm_hv_invtsc_suppressed(vcpu)) > - *edx &= ~SF(CONSTANT_TSC); > + *edx &= ~feature_bit(CONSTANT_TSC); > } > } else { > *eax = *ebx = *ecx = *edx = 0; Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 097bdc022d0f..776f24408fa3 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -1630,7 +1630,7 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, *ebx &= ~(F(RTM) | F(HLE)); } else if (function == 0x80000007) { if (kvm_hv_invtsc_suppressed(vcpu)) - *edx &= ~SF(CONSTANT_TSC); + *edx &= ~feature_bit(CONSTANT_TSC); } } else { *eax = *ebx = *ecx = *edx = 0;
When clearing CONSTANT_TSC during CPUID emulation due to a Hyper-V quirk, use feature_bit() instead of SF() to ensure the bit is actually cleared. SF() evaluates to zero if the _host_ doesn't support the feature. I.e. KVM could keep the bit set if userspace advertised CONSTANT_TSC despite it not being supported in hardware. Note, translating from a scattered feature to a the hardware version is done by __feature_translate(), not SF(). The sole purpose of SF() is to check kernel support for the scattered feature, *before* translation. Cc: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- arch/x86/kvm/cpuid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)