Skip to content

Commit

Permalink
net: page_pool: split the page_pool_params into fast and slow
Browse files Browse the repository at this point in the history
struct page_pool is rather performance critical and we use
16B of the first cache line to store 2 pointers used only
by test code. Future patches will add more informational
(non-fast path) attributes.

It's convenient for the user of the API to not have to worry
which fields are fast and which are slow path. Use struct
groups to split the params into the two categories internally.

Acked-by: Jesper Dangaard Brouer <[email protected]>
Reviewed-by: Mina Almasry <[email protected]>
Reviewed-by: Ilias Apalodimas <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
kuba-moo committed Nov 22, 2023
1 parent 3a17ea7 commit 5027ec1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 15 deletions.
31 changes: 19 additions & 12 deletions include/net/page_pool/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,22 @@ struct pp_alloc_cache {
* @offset: DMA sync address offset for PP_FLAG_DMA_SYNC_DEV
*/
struct page_pool_params {
unsigned int flags;
unsigned int order;
unsigned int pool_size;
int nid;
struct device *dev;
struct napi_struct *napi;
enum dma_data_direction dma_dir;
unsigned int max_len;
unsigned int offset;
struct_group_tagged(page_pool_params_fast, fast,
unsigned int flags;
unsigned int order;
unsigned int pool_size;
int nid;
struct device *dev;
struct napi_struct *napi;
enum dma_data_direction dma_dir;
unsigned int max_len;
unsigned int offset;
);
struct_group_tagged(page_pool_params_slow, slow,
/* private: used by test code only */
void (*init_callback)(struct page *page, void *arg);
void *init_arg;
void (*init_callback)(struct page *page, void *arg);
void *init_arg;
);
};

#ifdef CONFIG_PAGE_POOL_STATS
Expand Down Expand Up @@ -119,7 +123,7 @@ struct page_pool_stats {
#endif

struct page_pool {
struct page_pool_params p;
struct page_pool_params_fast p;

long frag_users;
struct page *frag_page;
Expand Down Expand Up @@ -178,6 +182,9 @@ struct page_pool {
refcount_t user_cnt;

u64 destroy_cnt;

/* Slow/Control-path information follows */
struct page_pool_params_slow slow;
};

struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
Expand Down
7 changes: 4 additions & 3 deletions net/core/page_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ static int page_pool_init(struct page_pool *pool,
{
unsigned int ring_qsize = 1024; /* Default */

memcpy(&pool->p, params, sizeof(pool->p));
memcpy(&pool->p, &params->fast, sizeof(pool->p));
memcpy(&pool->slow, &params->slow, sizeof(pool->slow));

/* Validate only known flags were used */
if (pool->p.flags & ~(PP_FLAG_ALL))
Expand Down Expand Up @@ -388,8 +389,8 @@ static void page_pool_set_pp_info(struct page_pool *pool,
* the overhead is negligible.
*/
page_pool_fragment_page(page, 1);
if (pool->p.init_callback)
pool->p.init_callback(page, pool->p.init_arg);
if (pool->slow.init_callback)
pool->slow.init_callback(page, pool->slow.init_arg);
}

static void page_pool_clear_pp_info(struct page *page)
Expand Down

0 comments on commit 5027ec1

Please sign in to comment.