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: [RFC v3 01/18] netmem: introduce struct netmem_desc mirroring struct page
Date: Fri, 30 May 2025 10:10:02 +0900 [thread overview]
Message-ID: <20250530011002.GA3093@system.software.com> (raw)
In-Reply-To: <CAHS8izNBjkMLbQsP++0r+fbkW2q7gGOdrbmE7gH-=jQUMCgJ1g@mail.gmail.com>
On Thu, May 29, 2025 at 09:31:40AM -0700, Mina Almasry wrote:
> On Wed, May 28, 2025 at 8:11 PM Byungchul Park <byungchul@sk.com> wrote:
> > 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;
> > + union {
> > + struct netmem_desc desc;
> > +
> > + /* XXX: The following part should be removed once all
> > + * the references to them are converted so as to be
> > + * accessed via netmem_desc e.g. niov->desc.pp instead
> > + * of niov->pp.
> > + *
> > + * Plus, once struct netmem_desc has it own instance
> > + * from slab, network's fields of the following can be
> > + * moved out of struct netmem_desc like:
> > + *
> > + * struct net_iov {
> > + * struct netmem_desc desc;
> > + * struct net_iov_area *owner;
> > + * ...
> > + * };
> > + */
>
> We do not need to wait until netmem_desc has its own instance from
> slab to move the net_iov-specific fields out of netmem_desc. We can do
> that now, because there are no size restrictions on net_iov.
Got it. Thanks for explanation.
> So, I recommend change this to:
>
> struct net_iov {
> /* Union for anonymous aliasing: */
> union {
> struct netmem_desc desc;
> struct {
> unsigned long _flags;
> unsigned long pp_magic;
> struct page_pool *pp;
> unsigned long _pp_mapping_pad;
> unsigned long dma_addr;
> atomic_long_t pp_ref_count;
> };
> struct net_iov_area *owner;
> enum net_iov_type type;
> };
Do you mean?
struct net_iov {
/* Union for anonymous aliasing: */
union {
struct netmem_desc desc;
struct {
unsigned long _flags;
unsigned long pp_magic;
struct page_pool *pp;
unsigned long _pp_mapping_pad;
unsigned long dma_addr;
atomic_long_t pp_ref_count;
};
};
struct net_iov_area *owner;
enum net_iov_type type;
};
Right? If so, I will.
> > struct net_iov_area {
> > @@ -48,27 +110,22 @@ struct net_iov_area {
> > unsigned long base_virtual;
> > };
> >
> > -/* These fields in struct page are used by the page_pool and net stack:
> > +/* net_iov is union'ed with struct netmem_desc mirroring struct page, so
> > + * the page_pool can access these fields without worrying whether the
> > + * underlying fields are accessed via netmem_desc or directly via
> > + * net_iov, until all the references to them are converted so as to be
> > + * accessed via netmem_desc e.g. niov->desc.pp instead of niov->pp.
> > *
> > - * struct {
> > - * unsigned long pp_magic;
> > - * struct page_pool *pp;
> > - * unsigned long _pp_mapping_pad;
> > - * unsigned long dma_addr;
> > - * atomic_long_t pp_ref_count;
> > - * };
> > - *
> > - * We mirror the page_pool fields here so the page_pool can access these fields
> > - * without worrying whether the underlying fields belong to a page or net_iov.
> > - *
> > - * The non-net stack fields of struct page are private to the mm stack and must
> > - * never be mirrored to net_iov.
> > + * The non-net stack fields of struct page are private to the mm stack
> > + * and must never be mirrored to net_iov.
> > */
> > -#define NET_IOV_ASSERT_OFFSET(pg, iov) \
> > - static_assert(offsetof(struct page, pg) == \
> > +#define NET_IOV_ASSERT_OFFSET(desc, iov) \
> > + static_assert(offsetof(struct netmem_desc, desc) == \
> > offsetof(struct net_iov, iov))
> > +NET_IOV_ASSERT_OFFSET(_flags, type);
>
> Remove this assertion.
I will.
>
> > NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic);
> > NET_IOV_ASSERT_OFFSET(pp, pp);
> > +NET_IOV_ASSERT_OFFSET(_pp_mapping_pad, owner);
>
> And this one.
I will.
> (_flags, type) and (_pp_mapping_pad, owner) have very different
> semantics and usage, we should not assert they are not the same
> offset. However (pp, pp) and (pp_magic,pp_magic) have the same
> semantics and usage, so we do assert they are at the same offset.
>
> Code is allowed to access __netmem_clear_lsb(netmem)->pp or
> __netmem_clear_lsb(netmem)->pp_magic without caring what's the
> underlying memory type because both fields have the same semantics and
> usage.
>
> Code should *not* assume it can access
> __netmem_clear_lsb(netmem)->owner or __netmem_clear_lsb(netmem)->type
> without doing a check whether the underlying memory is
> page/netmem_desc or net_iov. These fields are only usable for net_iov,
Sounds good. Thanks.
Byungchul
> so let's explicitly move them to a different place.
>
> --
> Thanks,
> Mina
next prev parent reply other threads:[~2025-05-30 1:10 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-29 3:10 [RFC v3 00/18] Split netmem from struct page Byungchul Park
2025-05-29 3:10 ` [RFC v3 01/18] netmem: introduce struct netmem_desc mirroring " Byungchul Park
2025-05-29 16:31 ` Mina Almasry
2025-05-30 1:10 ` Byungchul Park [this message]
2025-05-30 17:50 ` Mina Almasry
2025-06-03 9:22 ` Stefan Metzmacher
2025-05-29 3:10 ` [RFC v3 02/18] netmem: introduce netmem alloc APIs to wrap page alloc APIs Byungchul Park
2025-05-29 3:10 ` [RFC v3 03/18] page_pool: use netmem alloc/put APIs in __page_pool_alloc_page_order() Byungchul Park
2025-05-29 3:10 ` [RFC v3 04/18] page_pool: rename __page_pool_alloc_page_order() to __page_pool_alloc_netmem_order() Byungchul Park
2025-05-29 3:10 ` [RFC v3 05/18] page_pool: use netmem alloc/put APIs in __page_pool_alloc_pages_slow() Byungchul Park
2025-05-29 3:10 ` [RFC v3 06/18] page_pool: rename page_pool_return_page() to page_pool_return_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 07/18] page_pool: use netmem put API in page_pool_return_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 08/18] page_pool: rename __page_pool_release_page_dma() to __page_pool_release_netmem_dma() Byungchul Park
2025-05-29 3:10 ` [RFC v3 09/18] page_pool: rename __page_pool_put_page() to __page_pool_put_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 10/18] page_pool: rename __page_pool_alloc_pages_slow() to __page_pool_alloc_netmems_slow() Byungchul Park
2025-05-29 3:10 ` [RFC v3 11/18] mlx4: use netmem descriptor and APIs for page pool Byungchul Park
2025-05-29 3:10 ` [RFC v3 12/18] netmem: use _Generic to cover const casting for page_to_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 13/18] netmem: remove __netmem_get_pp() Byungchul Park
2025-05-29 3:10 ` [RFC v3 14/18] page_pool: make page_pool_get_dma_addr() just wrap page_pool_get_dma_addr_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 15/18] netdevsim: use netmem descriptor and APIs for page pool Byungchul Park
2025-05-29 3:10 ` [RFC v3 16/18] netmem: introduce a netmem API, virt_to_head_netmem() Byungchul Park
2025-05-29 3:10 ` [RFC v3 17/18] mt76: use netmem descriptor and APIs for page pool Byungchul Park
2025-05-29 3:10 ` [RFC v3 18/18] page_pool: access ->pp_magic through struct netmem_desc in page_pool_page_is_pp() Byungchul Park
2025-05-29 19:54 ` Mina Almasry
2025-05-29 20:49 ` Pavel Begunkov
2025-05-30 1:16 ` Byungchul Park
2025-05-29 3:29 ` [RFC v3 00/18] Split netmem from struct page Byungchul Park
2025-05-30 15:04 ` Alexander Lobakin
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=20250530011002.GA3093@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.