[PATCH v4 03/18] PCI/P2PDMA: Restrict the p2pmem search to pool backed providers

From: Leon Romanovsky

Date: Fri Aug 21 2026 - 15:41:55 EST


From: Leon Romanovsky <leonro@xxxxxxxxxx>

pci_p2pmem_find_many() exists to pick a provider that the caller will
then allocate from with pci_alloc_p2pmem(), which goes straight to the
gen_pool:

ret = (void *)gen_pool_alloc_owner(p2pdma->pool, size, (void **) &ref);

pci_has_p2pmem() does not ask for that pool, only for the published flag.
The two used to be equivalent, because a provider could only exist by way
of pci_p2pdma_add_resource(), which always creates the pool.

pcim_p2pdma_init() broke that. It registers a provider for the DMABUF
path and never creates a pool, so pdev->p2pdma is set while
p2pdma->pool stays NULL. Nothing publishes such a provider today, so the
search cannot return one yet, but the flag alone no longer says what the
caller needs.

Ask for the pool as well, so the search covers the providers its result
is used for. A later patch documents the pdev->p2pdma lifetime and RCU
rules.

Tested-by: Tushar Dave <tdave@xxxxxxxxxx>
Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxx>
---
drivers/pci/p2pdma.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
index e8e8c7d81d22..6618ef170ce1 100644
--- a/drivers/pci/p2pdma.c
+++ b/drivers/pci/p2pdma.c
@@ -863,7 +863,12 @@ static bool pci_has_p2pmem(struct pci_dev *pdev)

rcu_read_lock();
p2pdma = rcu_dereference(pdev->p2pdma);
- res = p2pdma && p2pdma->p2pmem_published;
+ /*
+ * The callers hand the result to pci_alloc_p2pmem(), so only a
+ * provider backed by a pool is of any use here. pcim_p2pdma_init()
+ * creates providers without one.
+ */
+ res = p2pdma && p2pdma->pool && p2pdma->p2pmem_published;
rcu_read_unlock();

return res;

--
2.55.0