]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: RISC-V: Mark "struct page" pfns accessed before dropping mmu_lock
authorSean Christopherson <seanjc@google.com>
Thu, 10 Oct 2024 18:24:00 +0000 (11:24 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 25 Oct 2024 17:00:48 +0000 (13:00 -0400)
Mark pages accessed before dropping mmu_lock when faulting in guest memory
so that RISC-V can convert to kvm_release_faultin_page() without tripping
its lockdep assertion on mmu_lock being held.  Marking pages accessed
outside of mmu_lock is ok (not great, but safe), but marking pages _dirty_
outside of mmu_lock can make filesystems unhappy (see the link below).
Do both under mmu_lock to minimize the chances of doing the wrong thing in
the future.

Link: https://lore.kernel.org/all/cover.1683044162.git.lstoakes@gmail.com
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Acked-by: Anup Patel <anup@brainfault.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-59-seanjc@google.com>

arch/riscv/kvm/mmu.c

index 06aa5a0d056d47fbbd5f6bcf1c626488b7f78fd9..2e9aee51814273fb5b9cc7db5eef2b15f60cb220 100644 (file)
@@ -682,11 +682,11 @@ int kvm_riscv_gstage_map(struct kvm_vcpu *vcpu,
 
 out_unlock:
        if ((!ret || ret == -EEXIST) && writable)
-               kvm_set_pfn_dirty(hfn);
+               kvm_release_pfn_dirty(hfn);
+       else
+               kvm_release_pfn_clean(hfn);
 
        spin_unlock(&kvm->mmu_lock);
-       kvm_set_pfn_accessed(hfn);
-       kvm_release_pfn_clean(hfn);
        return ret;
 }