]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Drop superfluous caching of KVM_ASYNC_PF_SEND_ALWAYS
authorSean Christopherson <seanjc@google.com>
Mon, 6 Apr 2026 22:53:58 +0000 (15:53 -0700)
committerSean Christopherson <seanjc@google.com>
Wed, 13 May 2026 17:40:49 +0000 (10:40 -0700)
Drop kvm_vcpu_arch.apf.send_always and instead use msr_en_val as the source
of truth to reduce the probability of operating on stale data.  This fixes
flaws where KVM fails to update send_always when APF is explicitly
disabled by the guest or implicitly disabled by KVM on INIT.  Absent other
bugs, the flaws are benign as KVM *shouldn't* consume send_always when PV
APF support is disabled.

Simply delete the field, as there's zero benefit to maintaining a separate
"cache" of the state.

Opportunistically turn the enabled vs. disabled logic at the end of
kvm_pv_enable_async_pf() into an if-else instead of using an early return,
e.g. so that it's more obvious that both paths are "success" paths.

Fixes: 6adba5274206 ("KVM: Let host know whether the guest can handle async PF in non-userspace context.")
Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com>
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Link: https://patch.msgid.link/20260406225359.1245490-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/x86.c

index 5644dc9f08a48f3651db8060fc87bb71eb2f918f..2b986a733cd6210f5405c00c5681d9ab92645019 100644 (file)
@@ -1057,7 +1057,6 @@ struct kvm_vcpu_arch {
                u16 vec;
                u32 id;
                u32 host_apf_flags;
-               bool send_always;
                bool pageready_pending;
        } apf;
 
index 4bffcea3ede938e6c7b5bb1af296bbedddda14fc..b01f9a4d33630ba80f03b17ab2609ac8b0ca353c 100644 (file)
@@ -3660,16 +3660,12 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
 
        vcpu->arch.apf.msr_en_val = data;
 
-       if (!__kvm_pv_async_pf_enabled(data)) {
+       if (__kvm_pv_async_pf_enabled(data)) {
+               kvm_async_pf_wakeup_all(vcpu);
+       } else {
                kvm_clear_async_pf_completion_queue(vcpu);
                kvm_async_pf_hash_reset(vcpu);
-               return 0;
        }
-
-       vcpu->arch.apf.send_always = (data & KVM_ASYNC_PF_SEND_ALWAYS);
-
-       kvm_async_pf_wakeup_all(vcpu);
-
        return 0;
 }
 
@@ -14008,7 +14004,7 @@ static bool kvm_can_deliver_async_pf(struct kvm_vcpu *vcpu)
        if (!kvm_pv_async_pf_enabled(vcpu))
                return false;
 
-       if (!vcpu->arch.apf.send_always &&
+       if (!(vcpu->arch.apf.msr_en_val & KVM_ASYNC_PF_SEND_ALWAYS) &&
            (vcpu->arch.guest_state_protected || !kvm_x86_call(get_cpl)(vcpu)))
                return false;