Unmap vmcs12 and release the corresponding shadow vmcs
Signed-off-by: Abel Gordon <[email protected]>
---
arch/x86/kvm/vmx.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
--- .before/arch/x86/kvm/vmx.c 2013-04-17 14:20:50.000000000 +0300
+++ .after/arch/x86/kvm/vmx.c 2013-04-17 14:20:50.000000000 +0300
@@ -5581,6 +5581,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.
@@ -5591,8 +5602,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;
}
@@ -5736,8 +5746,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;
}
@@ -6020,10 +6029,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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html