KVM: x86: believe what KVM says about WAITPKG
Currently, QEMU is overriding KVM_GET_SUPPORTED_CPUID's answer for the WAITPKG bit depending on the "-overcommit cpu-pm" setting. This is a bad idea because it does not even check if the host supports it, but it can be done in x86_cpu_realizefn just like we do for the MONITOR bit. This patch moves it there, while making it conditional on host support for the related UMWAIT MSR. Cc: qemu-stable@nongnu.org Reported-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c0c8445255
commit
e1e43813e7
|
@ -6509,6 +6509,9 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
|||
host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
|
||||
&cpu->mwait.ecx, &cpu->mwait.edx);
|
||||
env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
|
||||
if (kvm_enabled() && kvm_has_waitpkg()) {
|
||||
env->features[FEAT_7_0_ECX] |= CPUID_7_0_ECX_WAITPKG;
|
||||
}
|
||||
}
|
||||
if (kvm_enabled() && cpu->ucode_rev == 0) {
|
||||
cpu->ucode_rev = kvm_arch_get_supported_msr_feature(kvm_state,
|
||||
|
|
|
@ -411,12 +411,6 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
|||
if (host_tsx_blacklisted()) {
|
||||
ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE);
|
||||
}
|
||||
} else if (function == 7 && index == 0 && reg == R_ECX) {
|
||||
if (enable_cpu_pm) {
|
||||
ret |= CPUID_7_0_ECX_WAITPKG;
|
||||
} else {
|
||||
ret &= ~CPUID_7_0_ECX_WAITPKG;
|
||||
}
|
||||
} else if (function == 7 && index == 0 && reg == R_EDX) {
|
||||
/*
|
||||
* Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.
|
||||
|
@ -4730,3 +4724,8 @@ int kvm_arch_msi_data_to_gsi(uint32_t data)
|
|||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
bool kvm_has_waitpkg(void)
|
||||
{
|
||||
return has_msr_umwait;
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@ void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
|||
|
||||
bool kvm_enable_x2apic(void);
|
||||
bool kvm_has_x2apic_api(void);
|
||||
bool kvm_has_waitpkg(void);
|
||||
|
||||
bool kvm_hv_vpindex_settable(void);
|
||||
|
||||
|
|
Loading…
Reference in a new issue