Message ID | 20191023193632.26917-2-saeedm@mellanox.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | page_pool: API for numa node change handling | expand |
On Wed, Oct 23, 2019 at 07:36:58PM +0000, Saeed Mahameed wrote: > Add page_pool_update_nid() to be called by page pool consumers when they > detect numa node changes. > > It will update the page pool nid value to start allocating from the new > effective numa node. > > This is to mitigate page pool allocating pages from a wrong numa node, > where the pool was originally allocated, and holding on to pages that > belong to a different numa node, which causes performance degradation. > > For pages that are already being consumed and could be returned to the > pool by the consumer, in next patch we will add a check per page to avoid > recycling them back to the pool and return them to the page allocator. > > Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> > Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com> > --- > include/net/page_pool.h | 7 +++++++ > include/trace/events/page_pool.h | 22 ++++++++++++++++++++++ > net/core/page_pool.c | 8 ++++++++ > 3 files changed, 37 insertions(+) > > diff --git a/include/net/page_pool.h b/include/net/page_pool.h > index 2cbcdbdec254..f46b78408e44 100644 > --- a/include/net/page_pool.h > +++ b/include/net/page_pool.h > @@ -226,4 +226,11 @@ static inline bool page_pool_put(struct page_pool *pool) > return refcount_dec_and_test(&pool->user_cnt); > } > > +/* Caller must provide appropriate safe context, e.g. NAPI. */ > +void page_pool_update_nid(struct page_pool *pool, int new_nid); > +static inline void page_pool_nid_changed(struct page_pool *pool, int new_nid) > +{ > + if (unlikely(pool->p.nid != new_nid)) > + page_pool_update_nid(pool, new_nid); > +} > #endif /* _NET_PAGE_POOL_H */ > diff --git a/include/trace/events/page_pool.h b/include/trace/events/page_pool.h > index 47b5ee880aa9..b58b6a3a3e57 100644 > --- a/include/trace/events/page_pool.h > +++ b/include/trace/events/page_pool.h > @@ -81,6 +81,28 @@ TRACE_EVENT(page_pool_state_hold, > __entry->pool, __entry->page, __entry->hold) > ); > > +TRACE_EVENT(page_pool_update_nid, > + > + TP_PROTO(const struct page_pool *pool, int new_nid), > + > + TP_ARGS(pool, new_nid), > + > + TP_STRUCT__entry( > + __field(const struct page_pool *, pool) > + __field(int, pool_nid) > + __field(int, new_nid) > + ), > + > + TP_fast_assign( > + __entry->pool = pool; > + __entry->pool_nid = pool->p.nid; > + __entry->new_nid = new_nid; > + ), > + > + TP_printk("page_pool=%p pool_nid=%d new_nid=%d", > + __entry->pool, __entry->pool_nid, __entry->new_nid) > +); > + > #endif /* _TRACE_PAGE_POOL_H */ > > /* This part must be outside protection */ > diff --git a/net/core/page_pool.c b/net/core/page_pool.c > index 5bc65587f1c4..953af6d414fb 100644 > --- a/net/core/page_pool.c > +++ b/net/core/page_pool.c > @@ -397,3 +397,11 @@ bool __page_pool_request_shutdown(struct page_pool *pool) > return __page_pool_safe_to_destroy(pool); > } > EXPORT_SYMBOL(__page_pool_request_shutdown); > + > +/* Caller must provide appropriate safe context, e.g. NAPI. */ > +void page_pool_update_nid(struct page_pool *pool, int new_nid) > +{ > + trace_page_pool_update_nid(pool, new_nid); > + pool->p.nid = new_nid; > +} > +EXPORT_SYMBOL(page_pool_update_nid); > -- > 2.21.0 > Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
diff --git a/include/net/page_pool.h b/include/net/page_pool.h index 2cbcdbdec254..f46b78408e44 100644 --- a/include/net/page_pool.h +++ b/include/net/page_pool.h @@ -226,4 +226,11 @@ static inline bool page_pool_put(struct page_pool *pool) return refcount_dec_and_test(&pool->user_cnt); } +/* Caller must provide appropriate safe context, e.g. NAPI. */ +void page_pool_update_nid(struct page_pool *pool, int new_nid); +static inline void page_pool_nid_changed(struct page_pool *pool, int new_nid) +{ + if (unlikely(pool->p.nid != new_nid)) + page_pool_update_nid(pool, new_nid); +} #endif /* _NET_PAGE_POOL_H */ diff --git a/include/trace/events/page_pool.h b/include/trace/events/page_pool.h index 47b5ee880aa9..b58b6a3a3e57 100644 --- a/include/trace/events/page_pool.h +++ b/include/trace/events/page_pool.h @@ -81,6 +81,28 @@ TRACE_EVENT(page_pool_state_hold, __entry->pool, __entry->page, __entry->hold) ); +TRACE_EVENT(page_pool_update_nid, + + TP_PROTO(const struct page_pool *pool, int new_nid), + + TP_ARGS(pool, new_nid), + + TP_STRUCT__entry( + __field(const struct page_pool *, pool) + __field(int, pool_nid) + __field(int, new_nid) + ), + + TP_fast_assign( + __entry->pool = pool; + __entry->pool_nid = pool->p.nid; + __entry->new_nid = new_nid; + ), + + TP_printk("page_pool=%p pool_nid=%d new_nid=%d", + __entry->pool, __entry->pool_nid, __entry->new_nid) +); + #endif /* _TRACE_PAGE_POOL_H */ /* This part must be outside protection */ diff --git a/net/core/page_pool.c b/net/core/page_pool.c index 5bc65587f1c4..953af6d414fb 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -397,3 +397,11 @@ bool __page_pool_request_shutdown(struct page_pool *pool) return __page_pool_safe_to_destroy(pool); } EXPORT_SYMBOL(__page_pool_request_shutdown); + +/* Caller must provide appropriate safe context, e.g. NAPI. */ +void page_pool_update_nid(struct page_pool *pool, int new_nid) +{ + trace_page_pool_update_nid(pool, new_nid); + pool->p.nid = new_nid; +} +EXPORT_SYMBOL(page_pool_update_nid);