From: Saeed Mahameed <sae...@mellanox.com> Add page_pool_update_nid() to be called from drivers when they detect numa node changes.
It will do: 1) Flush the pool's page cache and ptr_ring. 2) Update page pool nid value to start allocating from the new numa node. Signed-off-by: Saeed Mahameed <sae...@mellanox.com> Signed-off-by: Jonathan Lemon <jonathan.le...@gmail.com> --- include/net/page_pool.h | 10 ++++++++++ net/core/page_pool.c | 16 +++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/include/net/page_pool.h b/include/net/page_pool.h index 2cbcdbdec254..fb13cf6055ff 100644 --- a/include/net/page_pool.h +++ b/include/net/page_pool.h @@ -226,4 +226,14 @@ static inline bool page_pool_put(struct page_pool *pool) return refcount_dec_and_test(&pool->user_cnt); } +/* Only safe from napi context or when user guarantees it is thread safe */ +void __page_pool_flush(struct page_pool *pool); +static inline void page_pool_update_nid(struct page_pool *pool, int new_nid) +{ + if (unlikely(pool->p.nid != new_nid)) { + /* TODO: Add statistics/trace */ + __page_pool_flush(pool); + pool->p.nid = new_nid; + } +} #endif /* _NET_PAGE_POOL_H */ diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 5bc65587f1c4..678cf85f273a 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -373,16 +373,13 @@ void __page_pool_free(struct page_pool *pool) } EXPORT_SYMBOL(__page_pool_free); -/* Request to shutdown: release pages cached by page_pool, and check - * for in-flight pages - */ -bool __page_pool_request_shutdown(struct page_pool *pool) +void __page_pool_flush(struct page_pool *pool) { struct page *page; /* Empty alloc cache, assume caller made sure this is * no-longer in use, and page_pool_alloc_pages() cannot be - * call concurrently. + * called concurrently. */ while (pool->alloc.count) { page = pool->alloc.cache[--pool->alloc.count]; @@ -393,6 +390,15 @@ bool __page_pool_request_shutdown(struct page_pool *pool) * be in-flight. */ __page_pool_empty_ring(pool); +} +EXPORT_SYMBOL(__page_pool_flush); + +/* Request to shutdown: release pages cached by page_pool, and check + * for in-flight pages + */ +bool __page_pool_request_shutdown(struct page_pool *pool) +{ + __page_pool_flush(pool); return __page_pool_safe_to_destroy(pool); } -- 2.17.1