nvmx: mark ept single context invalidation as supported
authorBandan Das <bsd@redhat.com>
Tue, 2 Aug 2016 20:32:36 +0000 (16:32 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Aug 2016 12:21:52 +0000 (14:21 +0200)
Commit 4b855078601f ("KVM: nVMX: Don't advertise single
context invalidation for invept") removed advertising
single context invalidation since the spec does not mandate it.
However, some hypervisors (such as ESX) require it to be present
before willing to use ept in a nested environment. Advertise it
and fallback to the global case.

Signed-off-by: Bandan Das <bsd@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index b26c222ebeefca6463ce92f66f6daa5bcd1684a1..a45d8580f91e7e8459666d7c1f0076ab1803b821 100644 (file)
@@ -2809,12 +2809,8 @@ static void nested_vmx_setup_ctls_msrs(struct vcpu_vmx *vmx)
                        vmx->nested.nested_vmx_ept_caps |=
                                VMX_EPT_EXECUTE_ONLY_BIT;
                vmx->nested.nested_vmx_ept_caps &= vmx_capability.ept;
-               /*
-                * For nested guests, we don't do anything specific
-                * for single context invalidation. Hence, only advertise
-                * support for global context invalidation.
-                */
-               vmx->nested.nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT;
+               vmx->nested.nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT |
+                       VMX_EPT_EXTENT_CONTEXT_BIT;
        } else
                vmx->nested.nested_vmx_ept_caps = 0;
 
@@ -7608,12 +7604,16 @@ static int handle_invept(struct kvm_vcpu *vcpu)
 
        switch (type) {
        case VMX_EPT_EXTENT_GLOBAL:
+       /*
+        * TODO: track mappings and invalidate
+        * single context requests appropriately
+        */
+       case VMX_EPT_EXTENT_CONTEXT:
                kvm_mmu_sync_roots(vcpu);
                kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
                nested_vmx_succeed(vcpu);
                break;
        default:
-               /* Trap single context invalidation invept calls */
                BUG_ON(1);
                break;
        }