KVM: x86: Rename ->tlb_flush() to ->tlb_flush_all()
authorSean Christopherson <sean.j.christopherson@intel.com>
Fri, 20 Mar 2020 21:28:18 +0000 (14:28 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 21 Apr 2020 13:12:52 +0000 (09:12 -0400)
Rename ->tlb_flush() to ->tlb_flush_all() in preparation for adding a
new hook to flush only the current ASID/context.

Opportunstically replace the comment in vmx_flush_tlb() that explains
why it flushes all EPTP/VPID contexts with a comment explaining why it
unconditionally uses INVEPT when EPT is enabled.  I.e. rely on the "all"
part of the name to clarify why it does global INVEPT/INVVPID.

No functional change intended.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Message-Id: <20200320212833.3507-23-sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index 7156c74..e6305d5 100644 (file)
@@ -1103,7 +1103,7 @@ struct kvm_x86_ops {
        unsigned long (*get_rflags)(struct kvm_vcpu *vcpu);
        void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags);
 
-       void (*tlb_flush)(struct kvm_vcpu *vcpu);
+       void (*tlb_flush_all)(struct kvm_vcpu *vcpu);
        int  (*tlb_remote_flush)(struct kvm *kvm);
        int  (*tlb_remote_flush_with_range)(struct kvm *kvm,
                        struct kvm_tlb_range *range);
index 081f6b2..85e17a0 100644 (file)
@@ -5179,7 +5179,7 @@ int kvm_mmu_load(struct kvm_vcpu *vcpu)
        if (r)
                goto out;
        kvm_mmu_load_pgd(vcpu);
-       kvm_x86_ops.tlb_flush(vcpu);
+       kvm_x86_ops.tlb_flush_all(vcpu);
 out:
        return r;
 }
index fa5bb1b..72b976e 100644 (file)
@@ -3944,7 +3944,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = {
        .get_rflags = svm_get_rflags,
        .set_rflags = svm_set_rflags,
 
-       .tlb_flush = svm_flush_tlb,
+       .tlb_flush_all = svm_flush_tlb,
        .tlb_flush_gva = svm_flush_tlb_gva,
        .tlb_flush_guest = svm_flush_tlb,
 
index 0f1dfba..da86884 100644 (file)
@@ -2838,18 +2838,16 @@ static void exit_lmode(struct kvm_vcpu *vcpu)
 
 #endif
 
-static void vmx_flush_tlb(struct kvm_vcpu *vcpu)
+static void vmx_flush_tlb_all(struct kvm_vcpu *vcpu)
 {
        struct vcpu_vmx *vmx = to_vmx(vcpu);
 
        /*
-        * Flush all EPTP/VPID contexts, as the TLB flush _may_ have been
-        * invoked via kvm_flush_remote_tlbs().  Flushing remote TLBs requires
-        * all contexts to be flushed, not just the active context.
-        *
-        * Note, this also ensures a deferred TLB flush with VPID enabled and
-        * EPT disabled invalidates the "correct" VPID, by nuking both L1 and
-        * L2's VPIDs.
+        * INVEPT must be issued when EPT is enabled, irrespective of VPID, as
+        * the CPU is not required to invalidate guest-physical mappings on
+        * VM-Entry, even if VPID is disabled.  Guest-physical mappings are
+        * associated with the root EPT structure and not any particular VPID
+        * (INVVPID also isn't required to invalidate guest-physical mappings).
         */
        if (enable_ept) {
                ept_sync_global();
@@ -7765,7 +7763,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
        .get_rflags = vmx_get_rflags,
        .set_rflags = vmx_set_rflags,
 
-       .tlb_flush = vmx_flush_tlb,
+       .tlb_flush_all = vmx_flush_tlb_all,
        .tlb_flush_gva = vmx_flush_tlb_gva,
        .tlb_flush_guest = vmx_flush_tlb_guest,
 
index daf1624..cd2a3d0 100644 (file)
@@ -2690,10 +2690,10 @@ static void kvmclock_reset(struct kvm_vcpu *vcpu)
        vcpu->arch.time = 0;
 }
 
-static void kvm_vcpu_flush_tlb(struct kvm_vcpu *vcpu)
+static void kvm_vcpu_flush_tlb_all(struct kvm_vcpu *vcpu)
 {
        ++vcpu->stat.tlb_flush;
-       kvm_x86_ops.tlb_flush(vcpu);
+       kvm_x86_ops.tlb_flush_all(vcpu);
 }
 
 static void kvm_vcpu_flush_tlb_guest(struct kvm_vcpu *vcpu)
@@ -8223,7 +8223,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
                if (kvm_check_request(KVM_REQ_LOAD_MMU_PGD, vcpu))
                        kvm_mmu_load_pgd(vcpu);
                if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu))
-                       kvm_vcpu_flush_tlb(vcpu);
+                       kvm_vcpu_flush_tlb_all(vcpu);
                if (kvm_check_request(KVM_REQ_HV_TLB_FLUSH, vcpu))
                        kvm_vcpu_flush_tlb_guest(vcpu);
                if (kvm_check_request(KVM_REQ_REPORT_TPR_ACCESS, vcpu)) {