• Vitaly Kuznetsov's avatar
    KVM: x86: Use actual kvm_cpuid.base for clearing KVM_FEATURE_PV_UNHALT · 4736d85f
    Vitaly Kuznetsov authored
    Commit ee3a5f9e ("KVM: x86: Do runtime CPUID update before updating
    vcpu->arch.cpuid_entries") moved tweaking of the supplied CPUID
    data earlier in kvm_set_cpuid() but __kvm_update_cpuid_runtime() actually
    uses 'vcpu->arch.kvm_cpuid' (though __kvm_find_kvm_cpuid_features()) which
    gets set later in kvm_set_cpuid(). In some cases, e.g. when kvm_set_cpuid()
    is called for the first time and 'vcpu->arch.kvm_cpuid' is clear,
    __kvm_find_kvm_cpuid_features() fails to find KVM PV feature entry and the
    logic which clears KVM_FEATURE_PV_UNHALT after enabling
    KVM_X86_DISABLE_EXITS_HLT does not work.
    
    The logic, introduced by the commit ee3a5f9e ("KVM: x86: Do runtime
    CPUID update before updating vcpu->arch.cpuid_entries") must stay: the
    supplied CPUID data is tweaked by KVM first (__kvm_update_cpuid_runtime())
    and checked later (kvm_check_cpuid()) and the actual data
    (vcpu->arch.cpuid_*, vcpu->arch.kvm_cpuid, vcpu->arch.xen.cpuid,..) is only
    updated on success.
    
    Switch to searching for KVM_SIGNATURE in the supplied CPUID data to
    discover KVM PV feature entry instead of using stale 'vcpu->arch.kvm_cpuid'.
    
    While on it, drop pointless "&& (best->eax & (1 << KVM_FEATURE_PV_UNHALT)"
    check when clearing KVM_FEATURE_PV_UNHALT bit.
    
    Fixes: ee3a5f9e ("KVM: x86: Do runtime CPUID update before updating vcpu->arch.cpuid_entries")
    Reported-and-tested-by: default avatarLi RongQing <lirongqing@baidu.com>
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Link: https://lore.kernel.org/r/20240228101837.93642-3-vkuznets@redhat.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    4736d85f
cpuid.c 45.4 KB