summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinyu Tang <tjytimi@163.com>2026-05-17 18:34:23 +0300
committerAnup Patel <anup@brainfault.org>2026-06-03 15:49:53 +0300
commit9090ba2e7cf8bf8a54879182db5665452d515bb0 (patch)
treeee5806e9331fa414a9e96ab8db3e8997e88c6400
parentc70faabb6ddd06327ae778bf4f9b5b977749b315 (diff)
downloadlinux-9090ba2e7cf8bf8a54879182db5665452d515bb0.tar.xz
KVM: riscv: Rely on common MMU notifier locking
The common KVM invalidation paths call kvm_unmap_gfn_range() with mmu_lock already held for write. For the standard MMU notifier path, the call chain is: kvm_mmu_notifier_invalidate_range_start() kvm_handle_hva_range() kvm_unmap_gfn_range() kvm_mmu_notifier_invalidate_range_start() leaves range.lockless clear. kvm_handle_hva_range() therefore takes KVM_MMU_LOCK(kvm) before invoking the handler. The guest_memfd path has the same locking contract: __kvm_gmem_invalidate_begin() kvm_mmu_unmap_gfn_range() kvm_unmap_gfn_range() __kvm_gmem_invalidate_begin() explicitly takes KVM_MMU_LOCK(kvm) before calling kvm_mmu_unmap_gfn_range(). So remove the local trylock and make the common locking contract explicit with lockdep_assert_held_write() like x86. Signed-off-by: Jinyu Tang <tjytimi@163.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260517153427.94889-2-tjytimi@163.com Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r--arch/riscv/kvm/mmu.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c
index 8469ed932421..da944cb68404 100644
--- a/arch/riscv/kvm/mmu.c
+++ b/arch/riscv/kvm/mmu.c
@@ -245,22 +245,17 @@ out:
bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range)
{
struct kvm_gstage gstage;
- bool mmu_locked;
bool flush;
if (!kvm->arch.pgd)
return false;
- kvm_riscv_gstage_init(&gstage, kvm);
- mmu_locked = spin_trylock(&kvm->mmu_lock);
+ lockdep_assert_held_write(&kvm->mmu_lock);
+ kvm_riscv_gstage_init(&gstage, kvm);
flush = kvm_riscv_gstage_unmap_range(&gstage, range->start << PAGE_SHIFT,
(range->end - range->start) << PAGE_SHIFT,
range->may_block);
-
- if (mmu_locked)
- spin_unlock(&kvm->mmu_lock);
-
if (flush)
kvm_flush_remote_tlbs_range(kvm, range->start,
range->end - range->start);