[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250711011435.GC40145@system.software.com>
Date: Fri, 11 Jul 2025 10:14:35 +0900
From: Byungchul Park <byungchul@...com>
To: 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,
asml.silence@...il.com, 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, hannes@...xchg.org, ziy@...dia.com,
jackmanb@...gle.com
Subject: Re: [PATCH net-next v9 3/8] page_pool: access ->pp_magic through
struct netmem_desc in page_pool_page_is_pp()
On Thu, Jul 10, 2025 at 11:19:53AM -0700, Mina Almasry wrote:
> On Thu, Jul 10, 2025 at 1:28 AM 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>
> > Reviewed-by: Mina Almasry <almasrymina@...gle.com>
> > Reviewed-by: Pavel Begunkov <asml.silence@...il.com>
> > Reviewed-by: Vlastimil Babka <vbabka@...e.cz>
> > Acked-by: Harry Yoo <harry.yoo@...cle.com>
> > ---
> > include/linux/mm.h | 12 ------------
> > include/net/netmem.h | 17 +++++++++++++++++
> > mm/page_alloc.c | 1 +
> > 3 files changed, 18 insertions(+), 12 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index 0ef2ba0c667a..0b7f7f998085 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -4172,16 +4172,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 ad9444be229a..11e9de45efcb 100644
> > --- a/include/net/netmem.h
> > +++ b/include/net/netmem.h
> > @@ -355,6 +355,23 @@ static inline void *nmdesc_address(struct netmem_desc *nmdesc)
> > return page_address(nmdesc_to_page(nmdesc));
> > }
> >
> > +#ifdef CONFIG_PAGE_POOL
> > +/* XXX: This would better be moved to mm, once mm gets its way to
> > + * identify the type of page for page pool.
> > + */
> > +static inline bool page_pool_page_is_pp(struct page *page)
> > +{
> > + struct netmem_desc *desc = page_to_nmdesc(page);
> > +
> > + return (desc->pp_magic & PP_MAGIC_MASK) == PP_SIGNATURE;
> > +}
>
> pages can be pp pages (where they have pp fields inside of them) or
> non-pp pages (where they don't have pp fields inside them, because
> they were never allocated from the page_pool).
>
> Casting a page to a netmem_desc, and then checking if the page was a
> pp page doesn't makes sense to me on a fundamental level. The
> netmem_desc is only valid if the page was a pp page in the first
> place. Maybe page_to_nmdesc should reject the cast if the page is not
> a pp page or something.
Right, as you already know, the current mainline code already has the
same problem but we've been using the werid way so far, in other words,
mm code is checking if it's a pp page or not by using ->pp_magic, but
it's ->lur, ->buddy_list, or ->pcp_list if it's not a pp page.
Both the mainline code and this patch can make sense *only if* it's
actually a pp page. It's unevitable until mm provides a way to identify
the type of page for page pool. Thoughts?
Byungchul
> --
> Thanks,
> Mina
Powered by blists - more mailing lists