]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI/P2PDMA: Release per-CPU pgmap ref when vm_insert_page() fails
authorHou Tao <houtao1@huawei.com>
Sat, 20 Dec 2025 04:04:34 +0000 (12:04 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 8 Jan 2026 15:27:50 +0000 (09:27 -0600)
When vm_insert_page() fails in p2pmem_alloc_mmap(), p2pmem_alloc_mmap()
doesn't invoke percpu_ref_put() to free the per-CPU ref of pgmap acquired
after gen_pool_alloc_owner(), and memunmap_pages() will hang forever when
trying to remove the PCI device.

Fix it by adding the missed percpu_ref_put().

Fixes: 7e9c7ef83d78 ("PCI/P2PDMA: Allow userspace VMA allocations through sysfs")
Signed-off-by: Hou Tao <houtao1@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Reviewed-by: Alistair Popple <apopple@nvidia.com>
Link: https://patch.msgid.link/20251220040446.274991-2-houtao@huaweicloud.com
drivers/pci/p2pdma.c

index 4a2fc7ab42c349a15d397c5194bf3d732dd65658..218c1f5252b66012e6cebccf1deb9f3699419362 100644 (file)
@@ -152,6 +152,7 @@ static int p2pmem_alloc_mmap(struct file *filp, struct kobject *kobj,
                ret = vm_insert_page(vma, vaddr, page);
                if (ret) {
                        gen_pool_free(p2pdma->pool, (uintptr_t)kaddr, len);
+                       percpu_ref_put(ref);
                        return ret;
                }
                percpu_ref_get(ref);