Message ID | 20220622134202.7591-1-huangguangbin2@huawei.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: page_pool: optimize page pool page allocation in NUMA scenario | expand |
On Wed, 22 Jun 2022 21:42:02 +0800 Guangbin Huang wrote: > From: Jie Wang <wangjie125@huawei.com> > > Currently NIC packet receiving performance based on page pool deteriorates > occasionally. To analysis the causes of this problem page allocation stats > are collected. Here are the stats when NIC rx performance deteriorates: Please repost this and CC the page pool maintainers.
On 2022/6/24 11:53, Jakub Kicinski wrote: > On Wed, 22 Jun 2022 21:42:02 +0800 Guangbin Huang wrote: >> From: Jie Wang <wangjie125@huawei.com> >> >> Currently NIC packet receiving performance based on page pool deteriorates >> occasionally. To analysis the causes of this problem page allocation stats >> are collected. Here are the stats when NIC rx performance deteriorates: > > Please repost this and CC the page pool maintainers. > . > Ok.
diff --git a/net/core/page_pool.c b/net/core/page_pool.c index b151772dd94b..d88c0c24041a 100644 --- a/net/core/page_pool.c +++ b/net/core/page_pool.c @@ -377,6 +377,7 @@ static struct page *__page_pool_alloc_pages_slow(struct page_pool *pool, unsigned int pp_order = pool->p.order; struct page *page; int i, nr_pages; + int pref_nid; /* preferred NUMA node */ /* Don't support bulk alloc for high-order pages */ if (unlikely(pp_order)) @@ -386,10 +387,18 @@ static struct page *__page_pool_alloc_pages_slow(struct page_pool *pool, if (unlikely(pool->alloc.count > 0)) return pool->alloc.cache[--pool->alloc.count]; +#ifdef CONFIG_NUMA + pref_nid = (pool->p.nid == NUMA_NO_NODE) ? numa_mem_id() : pool->p.nid; +#else + /* Ignore pool->p.nid setting if !CONFIG_NUMA, helps compiler */ + pref_nid = numa_mem_id(); /* will be zero like page_to_nid() */ +#endif + /* Mark empty alloc.cache slots "empty" for alloc_pages_bulk_array */ memset(&pool->alloc.cache, 0, sizeof(void *) * bulk); - nr_pages = alloc_pages_bulk_array(gfp, bulk, pool->alloc.cache); + nr_pages = alloc_pages_bulk_array_node(gfp, pref_nid, bulk, + pool->alloc.cache); if (unlikely(!nr_pages)) return NULL;