]> www.infradead.org Git - users/griffoul/linux.git/commitdiff
net: page_pool: add page_pool_get()
authorJakub Kicinski <kuba@kernel.org>
Wed, 20 Aug 2025 02:56:50 +0000 (19:56 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 21 Aug 2025 15:03:54 +0000 (08:03 -0700)
There is a page_pool_put() function but no get equivalent.
Having multiple references to a page pool is quite useful.
It avoids branching in create / destroy paths in drivers
which support memory providers.

Use the new helper in bnxt.

Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250820025704.166248-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
include/net/page_pool/helpers.h

index ba99de4031388e3bc372e8bdaed11ec6cb9f5a4c..14fa5b9e0f6cfdbd7ea42f1b64e7f1eab943e4c6 100644 (file)
@@ -3800,8 +3800,7 @@ static void bnxt_free_rx_rings(struct bnxt *bp)
                        xdp_rxq_info_unreg(&rxr->xdp_rxq);
 
                page_pool_destroy(rxr->page_pool);
-               if (bnxt_separate_head_pool(rxr))
-                       page_pool_destroy(rxr->head_pool);
+               page_pool_destroy(rxr->head_pool);
                rxr->page_pool = rxr->head_pool = NULL;
 
                kfree(rxr->rx_agg_bmap);
@@ -3848,6 +3847,8 @@ static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
                pool = page_pool_create(&pp);
                if (IS_ERR(pool))
                        goto err_destroy_pp;
+       } else {
+               page_pool_get(pool);
        }
        rxr->head_pool = pool;
 
@@ -15903,8 +15904,7 @@ err_rxq_info_unreg:
        xdp_rxq_info_unreg(&clone->xdp_rxq);
 err_page_pool_destroy:
        page_pool_destroy(clone->page_pool);
-       if (bnxt_separate_head_pool(clone))
-               page_pool_destroy(clone->head_pool);
+       page_pool_destroy(clone->head_pool);
        clone->page_pool = NULL;
        clone->head_pool = NULL;
        return rc;
@@ -15922,8 +15922,7 @@ static void bnxt_queue_mem_free(struct net_device *dev, void *qmem)
        xdp_rxq_info_unreg(&rxr->xdp_rxq);
 
        page_pool_destroy(rxr->page_pool);
-       if (bnxt_separate_head_pool(rxr))
-               page_pool_destroy(rxr->head_pool);
+       page_pool_destroy(rxr->head_pool);
        rxr->page_pool = NULL;
        rxr->head_pool = NULL;
 
index db180626be06d5ad931e68abe08a15ea578e7832..aa3719f28216a4e330dde524786d678b06d6ce3a 100644 (file)
@@ -489,6 +489,11 @@ page_pool_dma_sync_netmem_for_cpu(const struct page_pool *pool,
                                     offset, dma_sync_size);
 }
 
+static inline void page_pool_get(struct page_pool *pool)
+{
+       refcount_inc(&pool->user_cnt);
+}
+
 static inline bool page_pool_put(struct page_pool *pool)
 {
        return refcount_dec_and_test(&pool->user_cnt);