On 6/13/24 02:35, Mina Almasry wrote:
Implement a memory provider that allocates dmabuf devmem in the form of
net_iov.

The provider receives a reference to the struct netdev_dmabuf_binding
via the pool->mp_priv pointer. The driver needs to set this pointer for
the provider in the net_iov.

The provider obtains a reference on the netdev_dmabuf_binding which
guarantees the binding and the underlying mapping remains alive until
the provider is destroyed.

Usage of PP_FLAG_DMA_MAP is required for this memory provide such that
the page_pool can provide the driver with the dma-addrs of the devmem.

Support for PP_FLAG_DMA_SYNC_DEV is omitted for simplicity & p.order !=
0.

Signed-off-by: Willem de Bruijn <will...@google.com>
Signed-off-by: Kaiyuan Zhang <kaiyu...@google.com>
Signed-off-by: Mina Almasry <almasrym...@google.com>

Comments below, apart from them

Reviewed-by: Pavel Begunkov <asml.sile...@gmail.com>


diff --git a/net/core/devmem.c b/net/core/devmem.c
index f4fd9b9dbb675..d3843eade5fc2 100644
--- a/net/core/devmem.c
+++ b/net/core/devmem.c
@@ -17,6 +17,7 @@
...
+
+bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem)
+{
+       WARN_ON_ONCE(!netmem_is_net_iov(netmem));
+       WARN_ON_ONCE(atomic_long_read(netmem_get_pp_ref_count_ref(netmem)) !=
+                    1);

If you're adding it anyway, maybe
"if (warn) return" ?

+
+       page_pool_clear_pp_info(netmem);
+
+       net_devmem_free_dmabuf(netmem_to_net_iov(netmem));
+
+       /* We don't want the page pool put_page()ing our net_iovs. */
+       return false;
+}
+
  #endif
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index 1152e3547795a..22e3c58648d42 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -13,6 +13,7 @@
...
@@ -269,7 +275,25 @@ static int page_pool_init(struct page_pool *pool,
        if (pool->dma_map)
                get_device(pool->p.dev);
+ if (pool->p.queue)
+               pool->mp_priv = READ_ONCE(pool->p.queue->mp_params.mp_priv);
+
+       if (pool->mp_priv) {
+               err = mp_dmabuf_devmem_init(pool);
+               if (err) {
+                       pr_warn("%s() mem-provider init failed %d\n", __func__,
+                               err);
+                       goto free_ptr_ring;

Should also free stats, look up

free_percpu(pool->recycle_stats);

--
Pavel Begunkov

Reply via email to