Move free_nested() down below vmx_switch_vmcs() so that a future patch
can do an "emergency" invocation of vmx_switch_vmcs() if vmcs01 is not
the loaded VMCS when freeing nested resources.

No functional change intended.

Signed-off-by: Sean Christopherson <[email protected]>
---
 arch/x86/kvm/vmx/nested.c | 88 +++++++++++++++++++--------------------
 1 file changed, 44 insertions(+), 44 deletions(-)

diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index 7d4457aaab2ef..e9b27c6478da3 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -233,50 +233,6 @@ static inline void nested_release_evmcs(struct kvm_vcpu 
*vcpu)
        vmx->nested.hv_evmcs = NULL;
 }
 
-/*
- * Free whatever needs to be freed from vmx->nested when L1 goes down, or
- * just stops using VMX.
- */
-static void free_nested(struct kvm_vcpu *vcpu)
-{
-       struct vcpu_vmx *vmx = to_vmx(vcpu);
-
-       if (!vmx->nested.vmxon && !vmx->nested.smm.vmxon)
-               return;
-
-       kvm_clear_request(KVM_REQ_GET_VMCS12_PAGES, vcpu);
-
-       vmx->nested.vmxon = false;
-       vmx->nested.smm.vmxon = false;
-       free_vpid(vmx->nested.vpid02);
-       vmx->nested.posted_intr_nv = -1;
-       vmx->nested.current_vmptr = -1ull;
-       if (enable_shadow_vmcs) {
-               vmx_disable_shadow_vmcs(vmx);
-               vmcs_clear(vmx->vmcs01.shadow_vmcs);
-               free_vmcs(vmx->vmcs01.shadow_vmcs);
-               vmx->vmcs01.shadow_vmcs = NULL;
-       }
-       kfree(vmx->nested.cached_vmcs12);
-       vmx->nested.cached_vmcs12 = NULL;
-       kfree(vmx->nested.cached_shadow_vmcs12);
-       vmx->nested.cached_shadow_vmcs12 = NULL;
-       /* Unpin physical memory we referred to in the vmcs02 */
-       if (vmx->nested.apic_access_page) {
-               kvm_release_page_clean(vmx->nested.apic_access_page);
-               vmx->nested.apic_access_page = NULL;
-       }
-       kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);
-       kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true);
-       vmx->nested.pi_desc = NULL;
-
-       kvm_mmu_free_roots(vcpu, &vcpu->arch.guest_mmu, KVM_MMU_ROOTS_ALL);
-
-       nested_release_evmcs(vcpu);
-
-       free_loaded_vmcs(&vmx->nested.vmcs02);
-}
-
 static void vmx_sync_vmcs_host_state(struct vcpu_vmx *vmx,
                                     struct loaded_vmcs *prev)
 {
@@ -315,6 +271,50 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct 
loaded_vmcs *vmcs)
        vmx_register_cache_reset(vcpu);
 }
 
+/*
+ * Free whatever needs to be freed from vmx->nested when L1 goes down, or
+ * just stops using VMX.
+ */
+static void free_nested(struct kvm_vcpu *vcpu)
+{
+       struct vcpu_vmx *vmx = to_vmx(vcpu);
+
+       if (!vmx->nested.vmxon && !vmx->nested.smm.vmxon)
+               return;
+
+       kvm_clear_request(KVM_REQ_GET_VMCS12_PAGES, vcpu);
+
+       vmx->nested.vmxon = false;
+       vmx->nested.smm.vmxon = false;
+       free_vpid(vmx->nested.vpid02);
+       vmx->nested.posted_intr_nv = -1;
+       vmx->nested.current_vmptr = -1ull;
+       if (enable_shadow_vmcs) {
+               vmx_disable_shadow_vmcs(vmx);
+               vmcs_clear(vmx->vmcs01.shadow_vmcs);
+               free_vmcs(vmx->vmcs01.shadow_vmcs);
+               vmx->vmcs01.shadow_vmcs = NULL;
+       }
+       kfree(vmx->nested.cached_vmcs12);
+       vmx->nested.cached_vmcs12 = NULL;
+       kfree(vmx->nested.cached_shadow_vmcs12);
+       vmx->nested.cached_shadow_vmcs12 = NULL;
+       /* Unpin physical memory we referred to in the vmcs02 */
+       if (vmx->nested.apic_access_page) {
+               kvm_release_page_clean(vmx->nested.apic_access_page);
+               vmx->nested.apic_access_page = NULL;
+       }
+       kvm_vcpu_unmap(vcpu, &vmx->nested.virtual_apic_map, true);
+       kvm_vcpu_unmap(vcpu, &vmx->nested.pi_desc_map, true);
+       vmx->nested.pi_desc = NULL;
+
+       kvm_mmu_free_roots(vcpu, &vcpu->arch.guest_mmu, KVM_MMU_ROOTS_ALL);
+
+       nested_release_evmcs(vcpu);
+
+       free_loaded_vmcs(&vmx->nested.vmcs02);
+}
+
 /*
  * Ensure that the current vmcs of the logical processor is the
  * vmcs01 of the vcpu before calling free_nested().
-- 
2.26.0

Reply via email to