Re: [PATCH net-next v9 3/8] page_pool: access ->pp_magic through struct netmem_desc in page_pool_page_is_pp()
From: Mina Almasry <hidden>
Date: 2025-07-14 19:10:04
Also in:
bpf, linux-mm, linux-rdma, lkml
On Thu, Jul 10, 2025 at 6:14 PM Byungchul Park [off-list ref] wrote:
On Thu, Jul 10, 2025 at 11:19:53AM -0700, Mina Almasry wrote:quoted
On Thu, Jul 10, 2025 at 1:28 AM Byungchul Park [off-list ref] wrote:quoted
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@sk.com> Reviewed-by: Toke Høiland-Jørgensen <redacted> Reviewed-by: Mina Almasry <redacted> Reviewed-by: Pavel Begunkov <asml.silence@gmail.com> Reviewed-by: Vlastimil Babka <redacted> Acked-by: Harry Yoo <redacted> --- 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?
I don't see mainline having a problem. Mainline checks that the page is a pp page via the magic before using any of the pp fields. This is because a page* can be a pp page or a non-pp page. With netmem_desc, having a netmem_desc* should imply that the underlying memory is a pp page. Having a netmem_desc* that is not valid because the pp_magic is not correct complicates the code for no reason. Every user of netmem_desc has to check pp_magic before actually using the fields. page_to_nmdesc should just refuse to return a netmem_desc* if the page is not a pp page. Also, this patch has my Reviewed-by, even though I honestly don't see it as acceptable and I clearly have feedback (and Pavel seems too?). __please__, when you make significant changes to a patch, you have to reset the Reviewed-by tags. -- Thanks, Mina