• Sean Christopherson's avatar
    KVM: x86: Retry page fault if MMU reload is pending and root has no sp · 18c841e1
    Sean Christopherson authored
    Play nice with a NULL shadow page when checking for an obsolete root in
    the page fault handler by flagging the page fault as stale if there's no
    shadow page associated with the root and KVM_REQ_MMU_RELOAD is pending.
    Invalidating memslots, which is the only case where _all_ roots need to
    be reloaded, requests all vCPUs to reload their MMUs while holding
    mmu_lock for lock.
    
    The "special" roots, e.g. pae_root when KVM uses PAE paging, are not
    backed by a shadow page.  Running with TDP disabled or with nested NPT
    explodes spectaculary due to dereferencing a NULL shadow page pointer.
    
    Skip the KVM_REQ_MMU_RELOAD check if there is a valid shadow page for the
    root.  Zapping shadow pages in response to guest activity, e.g. when the
    guest frees a PGD, can trigger KVM_REQ_MMU_RELOAD even if the current
    vCPU isn't using the affected root.  I.e. KVM_REQ_MMU_RELOAD can be seen
    with a completely valid root shadow page.  This is a bit of a moot point
    as KVM currently unloads all roots on KVM_REQ_MMU_RELOAD, but that will
    be cleaned up in the future.
    
    Fixes: a955cad8 ("KVM: x86/mmu: Retry page fault if root is invalidated by memslot update")
    Cc: stable@vger.kernel.org
    Cc: Maxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20211209060552.2956723-2-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    18c841e1
mmu.c 169 KB