]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86/mmu: Don't mark unused faultin pages as accessed
authorSean Christopherson <seanjc@google.com>
Thu, 10 Oct 2024 18:23:50 +0000 (11:23 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 25 Oct 2024 17:00:47 +0000 (13:00 -0400)
When finishing guest page faults, don't mark pages as accessed if KVM
is resuming the guest _without_ installing a mapping, i.e. if the page
isn't being used.  While it's possible that marking the page accessed
could avoid minor thrashing due to reclaiming a page that the guest is
about to access, it's far more likely that the gfn=>pfn mapping was
was invalidated, e.g. due a memslot change, or because the corresponding
VMA is being modified.

Tested-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20241010182427.1434605-49-seanjc@google.com>

arch/x86/kvm/mmu/mmu.c

index fe3f3bc0bb79b14f713a42ecf89a1fce0363ce98..f3a4ed6afec2421330059abb0fbe34dfa8775c69 100644 (file)
@@ -4393,7 +4393,9 @@ static void kvm_mmu_finish_page_fault(struct kvm_vcpu *vcpu,
         * fault handler, and so KVM must (somewhat) speculatively mark the
         * folio dirty if KVM could locklessly make the SPTE writable.
         */
-       if (!fault->map_writable || r == RET_PF_RETRY)
+       if (r == RET_PF_RETRY)
+               kvm_release_page_unused(fault->refcounted_page);
+       else if (!fault->map_writable)
                kvm_release_page_clean(fault->refcounted_page);
        else
                kvm_release_page_dirty(fault->refcounted_page);