Re: [PATCH][v2] page_pool: handle page recycle for NUMA_NO_NODE condition
From: Jesper Dangaard Brouer
Date: Fri Dec 13 2019 - 03:49:01 EST
On Fri, 13 Dec 2019 14:53:37 +0800
Yunsheng Lin <linyunsheng@xxxxxxxxxx> wrote:
> On 2019/12/13 14:27, Li,Rongqing wrote:
> >>
> >> It is good to allocate the rx page close to both cpu and device,
> >> but if both goal can not be reached, maybe we choose to allocate
> >> page that close to cpu?
> >>
> > I think it is true
> >
> > If it is true, , we can remove pool->p.nid, and replace
> > alloc_pages_node with alloc_pages in __page_pool_alloc_pages_slow,
> > and change pool_page_reusable as that page_to_nid(page) is checked
> > with numa_mem_id()
No, as I explained before, you cannot use numa_mem_id() in pool_page_reusable,
because recycle call can happen from/on a remote CPU (and numa_mem_id()
uses the local CPU to determine the NUMA id).
Today we already have XDP cpumap redirect. And we are working on
extending this to SKBs, which will increase the likelihood even more.
I don't think we want to not-recycle if a remote NUMA node CPU happened
to touch the packet?
(Based on the optimizations done for Facebook (the reason we added this))
What seems to matter is the NUMA node of CPU that runs RX NAPI-polling,
this is the first CPU that touch the packet memory and struct-page
memory. For these drivers, it is also the same "RX-CPU" that does the
allocation of new pages (to refill the RX-ring), and these "new" pages
can come from the page_pool.
With this in mind, it does seem strange that we are doing the check on
the "free"/recycles code path, that can run on remote CPUs...
> > since alloc_pages hint to use the current node page, and
> > __page_pool_alloc_pages_slow will be called in NAPI polling often
> > if recycle failed, after some cycle, the page will be from local
> > memory node.
You are basically saying that the NUMA check should be moved to
allocation time, as it is running the RX-CPU (NAPI). And eventually
after some time the pages will come from correct NUMA node.
I think we can do that, and only affect the semi-fast-path.
We just need to handle that pages in the ptr_ring that are recycled can
be from the wrong NUMA node. In __page_pool_get_cached() when
consuming pages from the ptr_ring (__ptr_ring_consume_batched), then we
can evict pages from wrong NUMA node.
For the pool->alloc.cache we either accept, that it will eventually
after some time be emptied (it is only in a 100% XDP_DROP workload that
it will continue to reuse same pages). Or we simply clear the
pool->alloc.cache when calling page_pool_update_nid().
> Yes if allocation and recycling are in the same NAPI polling context.
Which is a false assumption.
> As pointed out by Saeed and Ilias, the allocation and recycling seems
> to may not be happening in the same NAPI polling context, see:
>
> "In the current code base if they are only called under NAPI this
> might be true. On the page_pool skb recycling patches though (yes
> we'll eventually send those :)) this is called from kfree_skb()."
>
> So there may need some additionl attention.
Yes, as explained above.
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer