]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: nVMX: Switch to vmcs01 to refresh APICv controls on-demand if L2 is active
authorSean Christopherson <seanjc@google.com>
Fri, 9 Jan 2026 03:45:29 +0000 (19:45 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 14 Jan 2026 01:35:31 +0000 (17:35 -0800)
If APICv is (un)inhibited while L2 is running, temporarily load vmcs01 and
immediately refresh the APICv controls in vmcs01 instead of deferring the
update until the next nested VM-Exit.  This all but eliminates potential
ordering issues due to vmcs01 not being synchronized with
kvm_lapic.apicv_active, e.g. where KVM _thinks_ it refreshed APICv, but
vmcs01 still contains stale state.

Reviewed-by: Chao Gao <chao.gao@intel.com>
Link: https://patch.msgid.link/20260109034532.1012993-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/vmx/vmx.h

index a24a6f5f1a066b91d88749da34efa88696b01e20..b141bc1fb247654d67e787a3285b8abab725f92c 100644 (file)
@@ -5134,11 +5134,6 @@ void __nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason,
                kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu);
        }
 
-       if (vmx->nested.update_vmcs01_apicv_status) {
-               vmx->nested.update_vmcs01_apicv_status = false;
-               vmx_refresh_apicv_exec_ctrl(vcpu);
-       }
-
        if ((vm_exit_reason != -1) &&
            (enable_shadow_vmcs || nested_vmx_is_evmptr12_valid(vmx)))
                vmx->nested.need_vmcs12_to_shadow_sync = true;
index 5d3746c49c4a389dde6718df9b0b201fc4fb42d4..e7bab908cf6cdf21e6ec9cd0be03785e1bb2eba4 100644 (file)
@@ -4578,10 +4578,7 @@ void vmx_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
 {
        struct vcpu_vmx *vmx = to_vmx(vcpu);
 
-       if (is_guest_mode(vcpu)) {
-               vmx->nested.update_vmcs01_apicv_status = true;
-               return;
-       }
+       guard(vmx_vmcs01)(vcpu);
 
        pin_controls_set(vmx, vmx_pin_based_exec_ctrl(vmx));
 
index 53969e49d9d184da04a751afb55c551c143e6183..dfc9766a7fa3de3d64339ac02181148ca84364c9 100644 (file)
@@ -133,7 +133,6 @@ struct nested_vmx {
 
        bool change_vmcs01_virtual_apic_mode;
        bool reload_vmcs01_apic_access_page;
-       bool update_vmcs01_apicv_status;
 
        /*
         * Enlightened VMCS has been enabled. It does not mean that L1 has to