• Liran Alon's avatar
    KVM: x86: Optimization: Requst TLB flush in fast_cr3_switch() instead of do it directly · 1924242b
    Liran Alon authored
    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: default avatarBhavesh Davda <bhavesh.davda@oracle.com>
    Signed-off-by: default avatarLiran Alon <liran.alon@oracle.com>
    Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Reviewed-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    1924242b
mmu.c 164 KB