Re: [PATCH v3 2/3] KVM: x86: Drop superfluous caching of KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT
From: Binbin Wu
Date: Thu Apr 09 2026 - 03:25:56 EST
On 4/7/2026 6:53 AM, Sean Christopherson wrote:
> Drop kvm_vcpu_arch.delivery_as_pf_vmexit and instead use msr_en_val as the
Nit:
kvm_vcpu_arch.apf.elivery_as_pf_vmexit
> source of truth to reduce the probability of operating on stale data. This
> fixes flaws where KVM fails to update delivery_as_pf_vmexit 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
> delivery_as_pf_vmexit when PV APF support is disabled.
>
> Simply delete the field, as there's zero benefit to maintaining a separate
> "cache" of the state.
>
> Fixes: 52a5c155cf79 ("KVM: async_pf: Let guest support delivery of async_pf from guest mode")
> Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
Reviewed-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx>
> ---
> arch/x86/include/asm/kvm_host.h | 1 -
> arch/x86/kvm/x86.c | 3 +--
> 2 files changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index c470e40a00aa..fae1f4aeca5a 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1039,7 +1039,6 @@ struct kvm_vcpu_arch {
> u32 id;
> u32 host_apf_flags;
> bool send_always;
> - bool delivery_as_pf_vmexit;
> bool pageready_pending;
> } apf;
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index c35d359b56dd..4632222a5d1c 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -3666,7 +3666,6 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
> }
>
> vcpu->arch.apf.send_always = (data & KVM_ASYNC_PF_SEND_ALWAYS);
> - vcpu->arch.apf.delivery_as_pf_vmexit = data & KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT;
>
> kvm_async_pf_wakeup_all(vcpu);
>
> @@ -14035,7 +14034,7 @@ static bool kvm_can_deliver_async_pf(struct kvm_vcpu *vcpu)
> * L1 needs to opt into the special #PF vmexits that are
> * used to deliver async page faults.
> */
> - return vcpu->arch.apf.delivery_as_pf_vmexit;
> + return vcpu->arch.apf.msr_en_val & KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT;
> } else {
> /*
> * Play it safe in case the guest temporarily disables paging.