• Maxim Levitsky's avatar
    KVM: x86/mmu: include EFER.LMA in extended mmu role · b8453cdc
    Maxim Levitsky authored
    Incorporate EFER.LMA into kvm_mmu_extended_role, as it used to compute the
    guest root level and is not reflected in kvm_mmu_page_role.level when TDP
    is in use.  When simply running the guest, it is impossible for EFER.LMA
    and kvm_mmu.root_level to get out of sync, as the guest cannot transition
    from PAE paging to 64-bit paging without toggling CR0.PG, i.e. without
    first bouncing through a different MMU context.  And stuffing guest state
    via KVM_SET_SREGS{,2} also ensures a full MMU context reset.
    
    However, if KVM_SET_SREGS{,2} is followed by KVM_SET_NESTED_STATE, e.g. to
    set guest state when migrating the VM while L2 is active, the vCPU state
    will reflect L2, not L1.  If L1 is using TDP for L2, then root_mmu will
    have been configured using L2's state, despite not being used for L2.  If
    L2.EFER.LMA != L1.EFER.LMA, and L2 is using PAE paging, then root_mmu will
    be configured for guest PAE paging, but will match the mmu_role for 64-bit
    paging and cause KVM to not reconfigure root_mmu on the next nested VM-Exit.
    
    Alternatively, the root_mmu's role could be invalidated after a successful
    KVM_SET_NESTED_STATE that yields vcpu->arch.mmu != vcpu->arch.root_mmu,
    i.e. that switches the active mmu to guest_mmu, but doing so is unnecessarily
    tricky, and not even needed if L1 and L2 do have the same role (e.g., they
    are both 64-bit guests and run with the same CR4).
    Suggested-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Message-Id: <20211115131837.195527-3-mlevitsk@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    b8453cdc
mmu.c 168 KB