mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 15:51:30 -05:00
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>
This commit is contained in:
@@ -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 @@ static int bnxt_queue_mem_alloc(struct net_device *dev, void *qmem, int idx)
|
||||
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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user