From: Byungchul Park <byungchul@sk.com>
To: Mina Almasry <almasrymina@google.com>
Cc: willy@infradead.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
kernel_team@skhynix.com, kuba@kernel.org,
ilias.apalodimas@linaro.org, harry.yoo@oracle.com,
hawk@kernel.org, akpm@linux-foundation.org, davem@davemloft.net,
john.fastabend@gmail.com, andrew+netdev@lunn.ch,
asml.silence@gmail.com, toke@redhat.com, tariqt@nvidia.com,
edumazet@google.com, pabeni@redhat.com, saeedm@nvidia.com,
leon@kernel.org, ast@kernel.org, daniel@iogearbox.net,
david@redhat.com, lorenzo.stoakes@oracle.com,
Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org,
surenb@google.com, mhocko@suse.com, horms@kernel.org,
linux-rdma@vger.kernel.org, bpf@vger.kernel.org,
vishal.moola@gmail.com, hannes@cmpxchg.org, ziy@nvidia.com,
jackmanb@google.com
Subject: Re: [PATCH net-next v9 2/8] netmem: introduce utility APIs to use struct netmem_desc
Date: Fri, 11 Jul 2025 10:02:53 +0900 [thread overview]
Message-ID: <20250711010253.GB40145@system.software.com> (raw)
In-Reply-To: <CAHS8izO0mgDBde57fxuN3ko38906F_C=pxxrSEnFA=_9ECO8oQ@mail.gmail.com>
On Thu, Jul 10, 2025 at 11:11:51AM -0700, Mina Almasry wrote:
>
> On Thu, Jul 10, 2025 at 1:28 AM Byungchul Park <byungchul@sk.com> wrote:
> >
> > To eliminate the use of the page pool fields in struct page, the page
> > pool code should use netmem descriptor and APIs instead.
> >
> > However, some code e.g. __netmem_to_page() is still used to access the
> > page pool fields e.g. ->pp via struct page, which should be changed so
> > as to access them via netmem descriptor, struct netmem_desc instead,
> > since the fields no longer will be available in struct page.
> >
> > Introduce utility APIs to make them easy to use struct netmem_desc as
> > descriptor. The APIs are:
> >
> > 1. __netmem_to_nmdesc(), to convert netmem_ref to struct netmem_desc,
> > but unsafely without checking if it's net_iov or system memory.
> >
> > 2. netmem_to_nmdesc(), to convert netmem_ref to struct netmem_desc,
> > safely with checking if it's net_iov or system memory.
> >
> > 3. nmdesc_to_page(), to convert struct netmem_desc to struct page,
> > assuming struct netmem_desc overlays on struct page.
> >
> > 4. page_to_nmdesc(), to convert struct page to struct netmem_desc,
> > assuming struct netmem_desc overlays on struct page, allowing only
> > head page to be converted.
> >
> > 5. nmdesc_adress(), to get its virtual address corresponding to the
> > struct netmem_desc.
> >
> > Signed-off-by: Byungchul Park <byungchul@sk.com>
> > ---
> > include/net/netmem.h | 41 +++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 41 insertions(+)
> >
> > diff --git a/include/net/netmem.h b/include/net/netmem.h
> > index 535cf17b9134..ad9444be229a 100644
> > --- a/include/net/netmem.h
> > +++ b/include/net/netmem.h
> > @@ -198,6 +198,32 @@ static inline struct page *netmem_to_page(netmem_ref netmem)
> > return __netmem_to_page(netmem);
> > }
> >
> > +/**
> > + * __netmem_to_nmdesc - unsafely get pointer to the &netmem_desc backing
> > + * @netmem
> > + * @netmem: netmem reference to convert
> > + *
> > + * Unsafe version of netmem_to_nmdesc(). When @netmem is always backed
> > + * by system memory, performs faster and generates smaller object code
> > + * (no check for the LSB, no WARN). When @netmem points to IOV, provokes
> > + * undefined behaviour.
> > + *
> > + * Return: pointer to the &netmem_desc (garbage if @netmem is not backed
> > + * by system memory).
> > + */
> > +static inline struct netmem_desc *__netmem_to_nmdesc(netmem_ref netmem)
> > +{
> > + return (__force struct netmem_desc *)netmem;
> > +}
> > +
>
> Does a netmem_desc represent the pp fields shared between struct page
> and struct net_iov, or does netmem_desc represent paged kernel memory?
> If the former, I don't think we need a safe and unsafe version of this
> helper, since netmem_ref always has netmem_desc fields underneath. If
Ah, right. I missed the point. I will narrow down into a single safe
helper for that purpose.
> the latter, then this helper should not exist at all. We should not
> allow casting netmem_ref to a netmem_desc without first checking if
> it's a net_iov.
>
> To be honest the cover letter should come up with a detailed
> explanation of (a) what are the current types (b) what are the new
> types (c) what are the relationships between the types, so these
> questions stop coming up.
I will. Thanks for the feedback.
> > +static inline struct netmem_desc *netmem_to_nmdesc(netmem_ref netmem)
> > +{
> > + if (WARN_ON_ONCE(netmem_is_net_iov(netmem)))
> > + return NULL;
> > +
> > + return __netmem_to_nmdesc(netmem);
> > +}
> > +
> > static inline struct net_iov *netmem_to_net_iov(netmem_ref netmem)
> > {
> > if (netmem_is_net_iov(netmem))
> > @@ -314,6 +340,21 @@ static inline netmem_ref netmem_compound_head(netmem_ref netmem)
> > return page_to_netmem(compound_head(netmem_to_page(netmem)));
> > }
> >
> > +#define nmdesc_to_page(nmdesc) (_Generic((nmdesc), \
> > + const struct netmem_desc * : (const struct page *)(nmdesc), \
> > + struct netmem_desc * : (struct page *)(nmdesc)))
> > +
> > +static inline struct netmem_desc *page_to_nmdesc(struct page *page)
> > +{
> > + VM_BUG_ON_PAGE(PageTail(page), page);
> > + return (struct netmem_desc *)page;
> > +}
> > +
>
> It's not safe to cast a page to netmem_desc, without first checking if
> it's a pp page or not, otherwise you may be casting random non-pp
> pages to netmem_desc...
Agree, but page_to_nmdesc() will be used in page_pool_page_is_pp() to
check if it's a pp page or not:
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;
}
Hm.. maybe, it'd be better to resore the original code and remove this
page_to_nmdesc() helper. FYI, the original code was:
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;
}
> > +static inline void *nmdesc_address(struct netmem_desc *nmdesc)
> > +{
> > + return page_address(nmdesc_to_page(nmdesc));
> > +}
> > +
> > /**
>
> Introduce helpers in the same patch that uses them please. Having to
> cross reference your series to see if there are any callers to this
> (and the callers are correct) is an unnecessary burden to the
> reviewers.
I adopted how Matthew Wilcox worked on this[1], but sure, I will.
[1] https://lore.kernel.org/linux-mm/20230111042214.907030-3-willy@infradead.org/
Byungchul
> --
> Thanks,
> Mina
next prev parent reply other threads:[~2025-07-11 1:02 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-10 8:27 [PATCH net-next v9 0/8] Split netmem from struct page Byungchul Park
2025-07-10 8:28 ` [PATCH net-next v9 1/8] netmem: introduce struct netmem_desc mirroring " Byungchul Park
2025-07-12 14:39 ` Pavel Begunkov
2025-07-14 4:23 ` Byungchul Park
2025-07-14 11:30 ` Pavel Begunkov
2025-07-14 11:58 ` Byungchul Park
2025-07-14 19:17 ` Mina Almasry
2025-07-15 10:01 ` Pavel Begunkov
2025-07-10 8:28 ` [PATCH net-next v9 2/8] netmem: introduce utility APIs to use struct netmem_desc Byungchul Park
2025-07-10 18:11 ` Mina Almasry
2025-07-11 1:02 ` Byungchul Park [this message]
2025-07-12 12:16 ` Pavel Begunkov
2025-07-12 12:05 ` Pavel Begunkov
2025-07-12 11:59 ` Pavel Begunkov
2025-07-13 23:07 ` Byungchul Park
2025-07-13 23:39 ` Byungchul Park
2025-07-14 9:43 ` Pavel Begunkov
2025-07-14 10:05 ` Byungchul Park
2025-07-14 11:45 ` Pavel Begunkov
2025-07-14 12:06 ` Byungchul Park
2025-07-10 8:28 ` [PATCH net-next v9 3/8] page_pool: access ->pp_magic through struct netmem_desc in page_pool_page_is_pp() Byungchul Park
2025-07-10 18:19 ` Mina Almasry
2025-07-11 1:14 ` Byungchul Park
2025-07-12 13:58 ` Pavel Begunkov
2025-07-12 14:52 ` David Hildenbrand
2025-07-12 15:09 ` Pavel Begunkov
2025-07-13 23:22 ` Byungchul Park
2025-07-17 3:08 ` Byungchul Park
2025-07-22 1:23 ` Byungchul Park
2025-07-28 18:19 ` Pavel Begunkov
2025-07-14 19:09 ` Mina Almasry
2025-07-15 9:53 ` Pavel Begunkov
2025-07-10 8:28 ` [PATCH net-next v9 4/8] netmem: use netmem_desc instead of page to access ->pp in __netmem_get_pp() Byungchul Park
2025-07-10 18:25 ` Mina Almasry
2025-07-11 1:17 ` Byungchul Park
2025-07-10 8:28 ` [PATCH net-next v9 5/8] netmem: introduce a netmem API, virt_to_head_netmem() Byungchul Park
2025-07-10 18:26 ` Mina Almasry
2025-07-10 8:28 ` [PATCH net-next v9 6/8] mlx4: use netmem descriptor and APIs for page pool Byungchul Park
2025-07-10 18:29 ` Mina Almasry
2025-07-11 1:32 ` Byungchul Park
2025-07-14 19:02 ` Mina Almasry
2025-07-10 8:28 ` [PATCH net-next v9 7/8] netdevsim: " Byungchul Park
2025-07-10 18:26 ` Mina Almasry
2025-07-10 8:28 ` [PATCH net-next v9 8/8] mt76: " Byungchul Park
2025-07-12 14:22 ` Pavel Begunkov
2025-07-14 2:13 ` Byungchul Park
2025-07-10 8:47 ` [PATCH net-next v9 0/8] Split netmem from struct page Byungchul Park
2025-07-10 18:35 ` Mina Almasry
2025-07-11 0:42 ` Byungchul Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250711010253.GB40145@system.software.com \
--to=byungchul@sk.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=almasrymina@google.com \
--cc=andrew+netdev@lunn.ch \
--cc=asml.silence@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=david@redhat.com \
--cc=edumazet@google.com \
--cc=hannes@cmpxchg.org \
--cc=harry.yoo@oracle.com \
--cc=hawk@kernel.org \
--cc=horms@kernel.org \
--cc=ilias.apalodimas@linaro.org \
--cc=jackmanb@google.com \
--cc=john.fastabend@gmail.com \
--cc=kernel_team@skhynix.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rdma@vger.kernel.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mhocko@suse.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rppt@kernel.org \
--cc=saeedm@nvidia.com \
--cc=surenb@google.com \
--cc=tariqt@nvidia.com \
--cc=toke@redhat.com \
--cc=vbabka@suse.cz \
--cc=vishal.moola@gmail.com \
--cc=willy@infradead.org \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.