]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Don't hold 'vm_table_lock' across guest page reclaim
authorWill Deacon <will@kernel.org>
Tue, 31 Mar 2026 15:50:55 +0000 (16:50 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 13:29:06 +0000 (14:29 +0100)
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 <will@kernel.org>
Link: https://patch.msgid.link/20260331155056.28220-4-will@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/pkvm.c

index b955da0e50bc36079669709d7844db47bd44fd2c..7ed96d64d611078d21c2b70fd708ab787c19b7b1 100644 (file)
@@ -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)
+       if (!hyp_vm)
+               return ret;
+
+       if (hyp_vm->kvm.arch.pkvm.is_dying)
                ret = __pkvm_host_reclaim_page_guest(gfn, hyp_vm);
-       hyp_spin_unlock(&vm_table_lock);
 
+       put_pkvm_hyp_vm(hyp_vm);
        return ret;
 }