Sean Christopherson <seanjc@xxxxxxxxxx> 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@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> -- Vitaly