Unmap vmcs12 and release the corresponding shadow vmcs 

Signed-off-by: Abel Gordon <ab...@il.ibm.com>
---
 arch/x86/kvm/vmx.c |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

--- .before/arch/x86/kvm/vmx.c  2013-03-10 18:00:55.000000000 +0200
+++ .after/arch/x86/kvm/vmx.c   2013-03-10 18:00:55.000000000 +0200
@@ -5484,6 +5484,17 @@ static int nested_vmx_check_permission(s
        return 1;
 }
 
+static inline void nested_release_vmcs12(struct vcpu_vmx *vmx)
+{
+       if (enable_shadow_vmcs) {
+               if (vmx->nested.current_vmcs12 != NULL) {
+                       free_vmcs(vmx->nested.current_shadow_vmcs);
+               }
+       }
+       kunmap(vmx->nested.current_vmcs12_page);
+       nested_release_page(vmx->nested.current_vmcs12_page);
+}
+
 /*
  * Free whatever needs to be freed from vmx->nested when L1 goes down, or
  * just stops using VMX.
@@ -5494,8 +5505,7 @@ static void free_nested(struct vcpu_vmx 
                return;
        vmx->nested.vmxon = false;
        if (vmx->nested.current_vmptr != -1ull) {
-               kunmap(vmx->nested.current_vmcs12_page);
-               nested_release_page(vmx->nested.current_vmcs12_page);
+               nested_release_vmcs12(vmx);
                vmx->nested.current_vmptr = -1ull;
                vmx->nested.current_vmcs12 = NULL;
        }
@@ -5640,8 +5650,7 @@ static int handle_vmclear(struct kvm_vcp
        }
 
        if (vmptr == vmx->nested.current_vmptr) {
-               kunmap(vmx->nested.current_vmcs12_page);
-               nested_release_page(vmx->nested.current_vmcs12_page);
+               nested_release_vmcs12(vmx);
                vmx->nested.current_vmptr = -1ull;
                vmx->nested.current_vmcs12 = NULL;
        }
@@ -5930,10 +5939,8 @@ static int handle_vmptrld(struct kvm_vcp
                        skip_emulated_instruction(vcpu);
                        return 1;
                }
-               if (vmx->nested.current_vmptr != -1ull) {
-                       kunmap(vmx->nested.current_vmcs12_page);
-                       nested_release_page(vmx->nested.current_vmcs12_page);
-               }
+               if (vmx->nested.current_vmptr != -1ull)
+                       nested_release_vmcs12(vmx);
 
                vmx->nested.current_vmptr = vmptr;
                vmx->nested.current_vmcs12 = new_vmcs12;

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to