Skip to content

Commit

Permalink
net: page_pool: factor out releasing DMA from releasing the page
Browse files Browse the repository at this point in the history
Releasing the DMA mapping will be useful for other types
of pages, so factor it out. Make sure compiler inlines it,
to avoid any regressions.

Signed-off-by: Mina Almasry <almasrymina@google.com>
Reviewed-by: Shakeel Butt <shakeelb@google.com>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed Dec 14, 2023
1 parent 0a149ab commit c3f687d
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions net/core/page_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -548,21 +548,16 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict)
return inflight;
}

/* Disconnects a page (from a page_pool). API users can have a need
* to disconnect a page (from a page_pool), to allow it to be used as
* a regular page (that will eventually be returned to the normal
* page-allocator via put_page).
*/
static void page_pool_return_page(struct page_pool *pool, struct page *page)
static __always_inline
void __page_pool_release_page_dma(struct page_pool *pool, struct page *page)
{
dma_addr_t dma;
int count;

if (!(pool->p.flags & PP_FLAG_DMA_MAP))
/* Always account for inflight pages, even if we didn't
* map them
*/
goto skip_dma_unmap;
return;

dma = page_pool_get_dma_addr(page);

Expand All @@ -571,7 +566,19 @@ static void page_pool_return_page(struct page_pool *pool, struct page *page)
PAGE_SIZE << pool->p.order, pool->p.dma_dir,
DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_WEAK_ORDERING);
page_pool_set_dma_addr(page, 0);
skip_dma_unmap:
}

/* Disconnects a page (from a page_pool). API users can have a need
* to disconnect a page (from a page_pool), to allow it to be used as
* a regular page (that will eventually be returned to the normal
* page-allocator via put_page).
*/
void page_pool_return_page(struct page_pool *pool, struct page *page)
{
int count;

__page_pool_release_page_dma(pool, page);

page_pool_clear_pp_info(page);

/* This may be the last page returned, releasing the pool, so
Expand Down

0 comments on commit c3f687d

Please sign in to comment.