Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: page_pool: add page_pool_get()

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>

+10 -6
+5 -6
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 3800 3800 xdp_rxq_info_unreg(&rxr->xdp_rxq); 3801 3801 3802 3802 page_pool_destroy(rxr->page_pool); 3803 - if (bnxt_separate_head_pool(rxr)) 3804 - page_pool_destroy(rxr->head_pool); 3803 + page_pool_destroy(rxr->head_pool); 3805 3804 rxr->page_pool = rxr->head_pool = NULL; 3806 3805 3807 3806 kfree(rxr->rx_agg_bmap); ··· 3847 3848 pool = page_pool_create(&pp); 3848 3849 if (IS_ERR(pool)) 3849 3850 goto err_destroy_pp; 3851 + } else { 3852 + page_pool_get(pool); 3850 3853 } 3851 3854 rxr->head_pool = pool; 3852 3855 ··· 15904 15903 xdp_rxq_info_unreg(&clone->xdp_rxq); 15905 15904 err_page_pool_destroy: 15906 15905 page_pool_destroy(clone->page_pool); 15907 - if (bnxt_separate_head_pool(clone)) 15908 - page_pool_destroy(clone->head_pool); 15906 + page_pool_destroy(clone->head_pool); 15909 15907 clone->page_pool = NULL; 15910 15908 clone->head_pool = NULL; 15911 15909 return rc; ··· 15922 15922 xdp_rxq_info_unreg(&rxr->xdp_rxq); 15923 15923 15924 15924 page_pool_destroy(rxr->page_pool); 15925 - if (bnxt_separate_head_pool(rxr)) 15926 - page_pool_destroy(rxr->head_pool); 15925 + page_pool_destroy(rxr->head_pool); 15927 15926 rxr->page_pool = NULL; 15928 15927 rxr->head_pool = NULL; 15929 15928
+5
include/net/page_pool/helpers.h
··· 489 489 offset, dma_sync_size); 490 490 } 491 491 492 + static inline void page_pool_get(struct page_pool *pool) 493 + { 494 + refcount_inc(&pool->user_cnt); 495 + } 496 + 492 497 static inline bool page_pool_put(struct page_pool *pool) 493 498 { 494 499 return refcount_dec_and_test(&pool->user_cnt);