[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <937e62c5-0d12-4bea-b0c1-a267c491cf72@gmail.com>
Date: Wed, 11 Jun 2025 15:30:28 +0100
From: Pavel Begunkov <asml.silence@...il.com>
To: Byungchul Park <byungchul@...com>, Mina Almasry <almasrymina@...gle.com>
Cc: willy@...radead.org, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-mm@...ck.org, kernel_team@...ynix.com,
kuba@...nel.org, ilias.apalodimas@...aro.org, harry.yoo@...cle.com,
hawk@...nel.org, akpm@...ux-foundation.org, davem@...emloft.net,
john.fastabend@...il.com, andrew+netdev@...n.ch, toke@...hat.com,
tariqt@...dia.com, edumazet@...gle.com, pabeni@...hat.com,
saeedm@...dia.com, leon@...nel.org, ast@...nel.org, daniel@...earbox.net,
david@...hat.com, lorenzo.stoakes@...cle.com, Liam.Howlett@...cle.com,
vbabka@...e.cz, rppt@...nel.org, surenb@...gle.com, mhocko@...e.com,
horms@...nel.org, linux-rdma@...r.kernel.org, bpf@...r.kernel.org,
vishal.moola@...il.com
Subject: Re: [PATCH net-next 9/9] page_pool: access ->pp_magic through struct
netmem_desc in page_pool_page_is_pp()
On 6/10/25 02:45, Byungchul Park wrote:
> On Mon, Jun 09, 2025 at 10:39:06AM -0700, Mina Almasry wrote:
>> On Sun, Jun 8, 2025 at 9:32 PM Byungchul Park <byungchul@...com> wrote:
>>>
>>> To simplify struct page, the effort to separate its own descriptor from
>>> struct page is required and the work for page pool is on going.
>>>
>>> To achieve that, all the code should avoid directly accessing page pool
>>> members of struct page.
>>>
>>> Access ->pp_magic through struct netmem_desc instead of directly
>>> accessing it through struct page in page_pool_page_is_pp(). Plus, move
>>> page_pool_page_is_pp() from mm.h to netmem.h to use struct netmem_desc
>>> without header dependency issue.
>>>
>>> Signed-off-by: Byungchul Park <byungchul@...com>
>>> Reviewed-by: Toke Høiland-Jørgensen <toke@...hat.com>
>>> ---
>>> include/linux/mm.h | 12 ------------
>>> include/net/netmem.h | 14 ++++++++++++++
>>> mm/page_alloc.c | 1 +
>>> 3 files changed, 15 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/include/linux/mm.h b/include/linux/mm.h
>>> index e51dba8398f7..f23560853447 100644
>>> --- a/include/linux/mm.h
>>> +++ b/include/linux/mm.h
>>> @@ -4311,16 +4311,4 @@ int arch_lock_shadow_stack_status(struct task_struct *t, unsigned long status);
>>> */
>>> #define PP_MAGIC_MASK ~(PP_DMA_INDEX_MASK | 0x3UL)
>>>
>>> -#ifdef CONFIG_PAGE_POOL
>>> -static inline bool page_pool_page_is_pp(struct page *page)
>>> -{
>>> - return (page->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
>>> -}
>>> -#else
>>> -static inline bool page_pool_page_is_pp(struct page *page)
>>> -{
>>> - return false;
>>> -}
>>> -#endif
>>> -
>>> #endif /* _LINUX_MM_H */
>>> diff --git a/include/net/netmem.h b/include/net/netmem.h
>>> index d84ab624b489..8f354ae7d5c3 100644
>>> --- a/include/net/netmem.h
>>> +++ b/include/net/netmem.h
>>> @@ -56,6 +56,20 @@ NETMEM_DESC_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
>>> */
>>> static_assert(sizeof(struct netmem_desc) <= offsetof(struct page, _refcount));
>>>
>>> +#ifdef CONFIG_PAGE_POOL
>>> +static inline bool page_pool_page_is_pp(struct page *page)
>>> +{
>>> + struct netmem_desc *desc = (struct netmem_desc *)page;
>>> +
>>> + return (desc->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
>>> +}
>>> +#else
>>> +static inline bool page_pool_page_is_pp(struct page *page)
>>> +{
>>> + return false;
>>> +}
>>> +#endif
>>> +
>>> /* net_iov */
>>>
>>> DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers);
>>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>>> index 4f29e393f6af..be0752c0ac92 100644
>>> --- a/mm/page_alloc.c
>>> +++ b/mm/page_alloc.c
>>> @@ -55,6 +55,7 @@
>>> #include <linux/delayacct.h>
>>> #include <linux/cacheinfo.h>
>>> #include <linux/pgalloc_tag.h>
>>> +#include <net/netmem.h>
>>
>> mm files starting to include netmem.h is a bit interesting. I did not
>> expect/want dependencies outside of net. If anything the netmem stuff
>> include linux/mm.h
>
> That's what I also concerned. However, now that there are no way to
> check the type of memory in a general way but require to use one of pp
> fields, page_pool_page_is_pp() should be served by pp code e.i. network
> subsystem.
>
> This should be changed once either 1) mm provides a general way to check
> the type or 2) pp code is moved to mm code. I think this approach
> should acceptable until then.
I'd argue in the end the helper should be in mm.h as mm is going to
dictate how to check the type and keep them enumerated.
Reviewed-by: Pavel Begunkov <asml.silence@...il.com>
--
Pavel Begunkov
Powered by blists - more mailing lists