From: Jinyu Tang Date: Sun, 17 May 2026 15:34:23 +0000 (+0800) Subject: KVM: riscv: Rely on common MMU notifier locking X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=9090ba2e7cf8bf8a54879182db5665452d515bb0;p=thirdparty%2Flinux.git 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 Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20260517153427.94889-2-tjytimi@163.com Signed-off-by: Anup Patel --- 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);