From bc20692f528b2ac8226bafe5b1db9a1f8be96dbf Mon Sep 17 00:00:00 2001 From: Will Deacon Date: Tue, 31 Mar 2026 16:50:55 +0100 Subject: [PATCH] KVM: arm64: Don't hold 'vm_table_lock' across guest page reclaim Now that the teardown of a VM cannot be finalised as long as a reference is held on the VM, rework __pkvm_reclaim_dying_guest_page() to hold a reference to the dying VM rather than take the global 'vm_table_lock' during the reclaim operation. Signed-off-by: Will Deacon Link: https://patch.msgid.link/20260331155056.28220-4-will@kernel.org Signed-off-by: Marc Zyngier --- arch/arm64/kvm/hyp/nvhe/pkvm.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index b955da0e50bc..7ed96d64d611 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -918,15 +918,16 @@ teardown_donated_memory(struct kvm_hyp_memcache *mc, void *addr, size_t size) int __pkvm_reclaim_dying_guest_page(pkvm_handle_t handle, u64 gfn) { - struct pkvm_hyp_vm *hyp_vm; + struct pkvm_hyp_vm *hyp_vm = get_pkvm_hyp_vm(handle); int ret = -EINVAL; - hyp_spin_lock(&vm_table_lock); - hyp_vm = get_vm_by_handle(handle); - if (hyp_vm && hyp_vm->kvm.arch.pkvm.is_dying) - ret = __pkvm_host_reclaim_page_guest(gfn, hyp_vm); - hyp_spin_unlock(&vm_table_lock); + if (!hyp_vm) + return ret; + if (hyp_vm->kvm.arch.pkvm.is_dying) + ret = __pkvm_host_reclaim_page_guest(gfn, hyp_vm); + + put_pkvm_hyp_vm(hyp_vm); return ret; }