Liran Alon <liran.alon@xxxxxxxxxx> writes: > When KVM emulates a nested VMEntry (L1->L2 VMEntry), it switches mmu root > page. If nEPT is used, this will happen from > kvm_init_shadow_ept_mmu()->__kvm_mmu_new_cr3() and otherwise it will > happpen from nested_vmx_load_cr3()->kvm_mmu_new_cr3(). Either case, > __kvm_mmu_new_cr3() will use fast_cr3_switch() in attempt to switch to a > previously cached root page. > > In case fast_cr3_switch() finds a matching cached root page, it will > set it in mmu->root_hpa and request KVM_REQ_LOAD_CR3 such that on > next entry to guest, KVM will set root HPA in appropriate hardware > fields (e.g. vmcs->eptp). In addition, fast_cr3_switch() calls > kvm_x86_ops->tlb_flush() in order to flush TLB as MMU root page > was replaced. > > This works as mmu->root_hpa, which vmx_flush_tlb() use, was > already replaced in cached_root_available(). However, this may > result in unnecessary INVEPT execution because a KVM_REQ_TLB_FLUSH > may have already been requested. For example, by prepare_vmcs02() > in case L1 don't use VPID. > > Therefore, change fast_cr3_switch() to just request TLB flush on > next entry to guest. > > Reviewed-by: Bhavesh Davda <bhavesh.davda@xxxxxxxxxx> > Signed-off-by: Liran Alon <liran.alon@xxxxxxxxxx> > --- > arch/x86/kvm/mmu.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 24c23c66b226..150d982ec1d2 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -4295,7 +4295,7 @@ static bool fast_cr3_switch(struct kvm_vcpu *vcpu, gpa_t new_cr3, > kvm_make_request(KVM_REQ_LOAD_CR3, vcpu); > if (!skip_tlb_flush) { > kvm_make_request(KVM_REQ_MMU_SYNC, vcpu); > - kvm_x86_ops->tlb_flush(vcpu, true); > + kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu); > } > > /* Reviewed-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> -- Vitaly