Patch "KVM: x86/mmu: Retry page faults that hit an invalid memslot" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    KVM: x86/mmu: Retry page faults that hit an invalid memslot

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     kvm-x86-mmu-retry-page-faults-that-hit-an-invalid-me.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit bebec236de2be95e1655dd9ce62868effa2351ce
Author: Sean Christopherson <seanjc@xxxxxxxxxx>
Date:   Thu Feb 25 12:47:30 2021 -0800

    KVM: x86/mmu: Retry page faults that hit an invalid memslot
    
    [ Upstream commit e0c378684b6545ad2d4403bb701d0ac4932b4e95 ]
    
    Retry page faults (re-enter the guest) that hit an invalid memslot
    instead of treating the memslot as not existing, i.e. handling the
    page fault as an MMIO access.  When deleting a memslot, SPTEs aren't
    zapped and the TLBs aren't flushed until after the memslot has been
    marked invalid.
    
    Handling the invalid slot as MMIO means there's a small window where a
    page fault could replace a valid SPTE with an MMIO SPTE.  The legacy
    MMU handles such a scenario cleanly, but the TDP MMU assumes such
    behavior is impossible (see the BUG() in __handle_changed_spte()).
    There's really no good reason why the legacy MMU should allow such a
    scenario, and closing this hole allows for additional cleanups.
    
    Fixes: 2f2fad0897cb ("kvm: x86/mmu: Add functions to handle changed TDP SPTEs")
    Cc: Ben Gardon <bgardon@xxxxxxxxxx>
    Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
    Message-Id: <20210225204749.1512652-6-seanjc@xxxxxxxxxx>
    Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 2d37068b7cd5..2f2576fd343e 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -3663,6 +3663,14 @@ static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn,
 	struct kvm_memory_slot *slot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
 	bool async;
 
+	/*
+	 * Retry the page fault if the gfn hit a memslot that is being deleted
+	 * or moved.  This ensures any existing SPTEs for the old memslot will
+	 * be zapped before KVM inserts a new MMIO SPTE for the gfn.
+	 */
+	if (slot && (slot->flags & KVM_MEMSLOT_INVALID))
+		return true;
+
 	/* Don't expose private memslots to L2. */
 	if (is_guest_mode(vcpu) && !kvm_is_visible_memslot(slot)) {
 		*pfn = KVM_PFN_NOSLOT;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux