aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/vmx.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 0d281dbc008f..9529bff04262 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -63,6 +63,9 @@ module_param_named(unrestricted_guest,
63static int __read_mostly emulate_invalid_guest_state = 0; 63static int __read_mostly emulate_invalid_guest_state = 0;
64module_param(emulate_invalid_guest_state, bool, S_IRUGO); 64module_param(emulate_invalid_guest_state, bool, S_IRUGO);
65 65
66static int __read_mostly vmm_exclusive = 1;
67module_param(vmm_exclusive, bool, S_IRUGO);
68
66#define KVM_GUEST_CR0_MASK_UNRESTRICTED_GUEST \ 69#define KVM_GUEST_CR0_MASK_UNRESTRICTED_GUEST \
67 (X86_CR0_WP | X86_CR0_NE | X86_CR0_NW | X86_CR0_CD) 70 (X86_CR0_WP | X86_CR0_NE | X86_CR0_NW | X86_CR0_CD)
68#define KVM_GUEST_CR0_MASK \ 71#define KVM_GUEST_CR0_MASK \
@@ -845,7 +848,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
845 struct vcpu_vmx *vmx = to_vmx(vcpu); 848 struct vcpu_vmx *vmx = to_vmx(vcpu);
846 u64 tsc_this, delta, new_offset; 849 u64 tsc_this, delta, new_offset;
847 850
848 if (vcpu->cpu != cpu) 851 if (vmm_exclusive && vcpu->cpu != cpu)
849 vcpu_clear(vmx); 852 vcpu_clear(vmx);
850 853
851 if (per_cpu(current_vmcs, cpu) != vmx->vmcs) { 854 if (per_cpu(current_vmcs, cpu) != vmx->vmcs) {
@@ -891,6 +894,8 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
891static void vmx_vcpu_put(struct kvm_vcpu *vcpu) 894static void vmx_vcpu_put(struct kvm_vcpu *vcpu)
892{ 895{
893 __vmx_load_host_state(to_vmx(vcpu)); 896 __vmx_load_host_state(to_vmx(vcpu));
897 if (!vmm_exclusive)
898 __vcpu_clear(to_vmx(vcpu));
894} 899}
895 900
896static void vmx_fpu_activate(struct kvm_vcpu *vcpu) 901static void vmx_fpu_activate(struct kvm_vcpu *vcpu)