[PATCH v4 01/10] PCI/P2PDMA: Split pool-related cleanup out of pci_p2pdma_release()

From: Matt Evans

Date: Wed Jul 01 2026 - 13:21:37 EST


Preparing for a refactor in a subsequent patch, split the pool-related
release code into a new pci_p2pdma_release_pool() function.

This allows future compile-time selection of a null implementation for
pci_p2pdma_release_pool(), when p2pdma.c is refactored into core- and
P2P-related files.

Signed-off-by: Matt Evans <matt@xxxxxxxxxx>
---
drivers/pci/p2pdma.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
index 7c898542af8d..a5a1baebc34e 100644
--- a/drivers/pci/p2pdma.c
+++ b/drivers/pci/p2pdma.c
@@ -226,6 +226,17 @@ static const struct dev_pagemap_ops p2pdma_pgmap_ops = {
.folio_free = p2pdma_folio_free,
};

+static void pci_p2pdma_release_pool(struct pci_dev *pdev,
+ struct pci_p2pdma *p2pdma)
+{
+ if (!p2pdma->pool)
+ return;
+
+ synchronize_rcu();
+ gen_pool_destroy(p2pdma->pool);
+ sysfs_remove_group(&pdev->dev.kobj, &p2pmem_group);
+}
+
static void pci_p2pdma_release(void *data)
{
struct pci_dev *pdev = data;
@@ -237,15 +248,8 @@ static void pci_p2pdma_release(void *data)

/* Flush and disable pci_alloc_p2p_mem() */
pdev->p2pdma = NULL;
- if (p2pdma->pool)
- synchronize_rcu();
+ pci_p2pdma_release_pool(pdev, p2pdma);
xa_destroy(&p2pdma->map_types);
-
- if (!p2pdma->pool)
- return;
-
- gen_pool_destroy(p2pdma->pool);
- sysfs_remove_group(&pdev->dev.kobj, &p2pmem_group);
}

/**
@@ -932,8 +936,8 @@ void *pci_alloc_p2pmem(struct pci_dev *pdev, size_t size)
struct pci_p2pdma *p2pdma;

/*
- * Pairs with synchronize_rcu() in pci_p2pdma_release() to
- * ensure pdev->p2pdma is non-NULL for the duration of the
+ * Pairs with synchronize_rcu() in pci_p2pdma_release_pool()
+ * to ensure pdev->p2pdma is non-NULL for the duration of the
* read-lock.
*/
rcu_read_lock();
--
2.50.1 (Apple Git-155)