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
Subject: Re: [PATCH v2 01/16] netmem: introduce struct netmem_desc struct_group_tagged()'ed on struct net_iov
Date: Thu, 29 May 2025 13:46:48 +0900 [thread overview]
Message-ID: <20250529044648.GA1148@system.software.com> (raw)
In-Reply-To: <CAHS8izPTBnSL_zrW-u0mKBXC=iP9=WZcS9etCRpufCkpCwYoAg@mail.gmail.com>
On Tue, May 27, 2025 at 08:39:43PM -0700, Mina Almasry wrote:
> On Tue, May 27, 2025 at 7:29 PM Byungchul Park <byungchul@sk.com> wrote:
> >
> > To simplify struct page, the page pool members of struct page should be
> > moved to other, allowing these members to be removed from struct page.
> >
> > Introduce a network memory descriptor to store the members, struct
> > netmem_desc, reusing struct net_iov that already mirrored struct page.
> >
> > While at it, add a static assert to prevent the size of struct
> > netmem_desc from getting bigger that might conflict with other members
> > within struct page.
> >
> > Signed-off-by: Byungchul Park <byungchul@sk.com>
>
> This patch looks fine to me, but as of this series this change seems
> unnecessary, no? You're not using netmem_desc for anything in this
> series AFAICT. It may make sense to keep this series as
> straightforward renames, and have the series that introduces
> netmem_desc be the same one that is removing the page_pool fields from
> struct page or does something useful with it?
I didn't document well nor even work quite well for my purpose. I have
to admit I was also confused because the network code already had a
struct mirroring struct page, net_iov, so I thought it could be the
descriptor along with struct netmeme_desc until the day for page pool.
However, thanks to you, Pavel, and all, I understand better what net_iov
is for. I posted v3 with all the feedbacks applied, I guess the changes
in v3 are going to meet what you guys asked me.
On the top of v3, I think we can work on organizing struct net_iov to
make it look like:
struct net_iov {
struct netmem_desc desc;
net_iov_field1;
net_iov_field2;
net_iov_field3;
...
};
In order to make it, we should convert all the references to the
existing fields in struct net_iov, to access them indirectly using desc
field like e.g. 'net_iov->pp' to 'net_iov->desc.pp'. Once the
conversion is completed, we can make net_iov look better, which is not
urgent and I will not include the work in this series.
Please check v3:
https://lore.kernel.org/all/20250529031047.7587-1-byungchul@sk.com/
https://lore.kernel.org/all/20250529031047.7587-2-byungchul@sk.com/
Thanks to all.
Byungchul
> > ---
> > include/net/netmem.h | 41 +++++++++++++++++++++++++++++++++++------
> > 1 file changed, 35 insertions(+), 6 deletions(-)
> >
> > diff --git a/include/net/netmem.h b/include/net/netmem.h
> > index 386164fb9c18..a721f9e060a2 100644
> > --- a/include/net/netmem.h
> > +++ b/include/net/netmem.h
> > @@ -31,12 +31,34 @@ enum net_iov_type {
> > };
> >
> > struct net_iov {
> > - enum net_iov_type type;
> > - unsigned long pp_magic;
> > - struct page_pool *pp;
> > - struct net_iov_area *owner;
> > - unsigned long dma_addr;
> > - atomic_long_t pp_ref_count;
> > + /*
> > + * XXX: Now that struct netmem_desc overlays on struct page,
>
> This starting statement doesn't make sense to me TBH. netmem_desc
> doesn't seem to overlay struct page? For example, enum net_iov_type
> overlays unsigned long page->flags. Both have very different semantics
> and usage, no?
>
> > + * struct_group_tagged() should cover all of them. However,
> > + * a separate struct netmem_desc should be declared and embedded,
> > + * once struct netmem_desc is no longer overlayed but it has its
> > + * own instance from slab. The final form should be:
> > + *
>
> Honestly I'm not sure about putting future plans that aren't
> completely agreed upon in code comments. May be better to keep these
> future plans to the series that actually introduces them?
>
> > + * struct netmem_desc {
> > + * unsigned long pp_magic;
> > + * struct page_pool *pp;
> > + * unsigned long dma_addr;
> > + * atomic_long_t pp_ref_count;
> > + * };
> > + *
> > + * struct net_iov {
> > + * enum net_iov_type type;
> > + * struct net_iov_area *owner;
> > + * struct netmem_desc;
> > + * };
> > + */
> > + struct_group_tagged(netmem_desc, desc,
> > + enum net_iov_type type;
> > + unsigned long pp_magic;
> > + struct page_pool *pp;
> > + struct net_iov_area *owner;
> > + unsigned long dma_addr;
> > + atomic_long_t pp_ref_count;
> > + );
> > };
> >
> > struct net_iov_area {
> > @@ -73,6 +95,13 @@ NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr);
> > NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
> > #undef NET_IOV_ASSERT_OFFSET
> >
> > +/*
> > + * Since struct netmem_desc uses the space in struct page, the size
> > + * should be checked, until struct netmem_desc has its own instance from
> > + * slab, to avoid conflicting with other members within struct page.
> > + */
> > +static_assert(sizeof(struct netmem_desc) <= offsetof(struct page, _refcount));
> > +
> > static inline struct net_iov_area *net_iov_owner(const struct net_iov *niov)
> > {
> > return niov->owner;
> > --
> > 2.17.1
> >
>
>
> --
> Thanks,
> Mina
next prev parent reply other threads:[~2025-05-29 4:46 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-28 2:28 [PATCH v2 00/16] Split netmem from struct page Byungchul Park
2025-05-28 2:28 ` [PATCH v2 01/16] netmem: introduce struct netmem_desc struct_group_tagged()'ed on struct net_iov Byungchul Park
2025-05-28 3:39 ` Mina Almasry
2025-05-29 4:46 ` Byungchul Park [this message]
2025-05-28 2:28 ` [PATCH v2 02/16] netmem: introduce netmem alloc APIs to wrap page alloc APIs Byungchul Park
2025-05-28 3:11 ` Mina Almasry
2025-05-28 5:26 ` Byungchul Park
2025-05-28 5:41 ` Byungchul Park
2025-05-28 2:28 ` [PATCH v2 03/16] page_pool: use netmem alloc/put APIs in __page_pool_alloc_page_order() Byungchul Park
2025-05-28 3:12 ` Mina Almasry
2025-05-28 2:28 ` [PATCH v2 04/16] page_pool: rename __page_pool_alloc_page_order() to __page_pool_alloc_large_netmem() Byungchul Park
2025-05-28 3:16 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 05/16] page_pool: use netmem alloc/put APIs in __page_pool_alloc_pages_slow() Byungchul Park
2025-05-28 3:17 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 06/16] page_pool: rename page_pool_return_page() to page_pool_return_netmem() Byungchul Park
2025-05-28 2:29 ` [PATCH v2 07/16] page_pool: use netmem put API in page_pool_return_netmem() Byungchul Park
2025-05-28 3:19 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 08/16] page_pool: rename __page_pool_release_page_dma() to __page_pool_release_netmem_dma() Byungchul Park
2025-05-28 3:21 ` Mina Almasry
2025-05-28 5:56 ` Byungchul Park
2025-05-28 20:29 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 09/16] page_pool: rename __page_pool_put_page() to __page_pool_put_netmem() Byungchul Park
2025-05-28 3:22 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 10/16] page_pool: rename __page_pool_alloc_pages_slow() to __page_pool_alloc_netmems_slow() Byungchul Park
2025-05-28 3:23 ` Mina Almasry
2025-05-28 2:29 ` [PATCH v2 11/16] mlx4: use netmem descriptor and APIs for page pool Byungchul Park
2025-05-28 2:29 ` [PATCH v2 12/16] netmem: use _Generic to cover const casting for page_to_netmem() Byungchul Park
2025-05-28 2:29 ` [PATCH v2 13/16] netmem: remove __netmem_get_pp() Byungchul Park
2025-05-28 2:29 ` [PATCH v2 14/16] page_pool: make page_pool_get_dma_addr() just wrap page_pool_get_dma_addr_netmem() Byungchul Park
2025-05-28 2:29 ` [PATCH v2 15/16] netdevsim: use netmem descriptor and APIs for page pool Byungchul Park
2025-05-28 3:25 ` Mina Almasry
2025-05-28 6:04 ` Byungchul Park
2025-05-28 2:29 ` [PATCH v2 16/16] mt76: " Byungchul Park
2025-05-28 3:32 ` Mina Almasry
2025-05-28 6:07 ` Byungchul Park
2025-05-28 6:07 ` Byungchul Park
2025-05-28 7:33 ` Toke Høiland-Jørgensen
2025-05-28 16:59 ` Mina Almasry
2025-05-28 15:57 ` kernel test robot
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=20250529044648.GA1148@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=harry.yoo@oracle.com \
--cc=hawk@kernel.org \
--cc=horms@kernel.org \
--cc=ilias.apalodimas@linaro.org \
--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 \
/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.