Byungchul Park <byungchul@xxxxxx> writes: > 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, relocate _pp_mapping_pad to group struct net_iov's fields. > > Signed-off-by: Byungchul Park <byungchul@xxxxxx> > --- > include/linux/mm_types.h | 2 +- > include/net/netmem.h | 43 +++++++++++++++++++++++++++++++++------- > 2 files changed, 37 insertions(+), 8 deletions(-) > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 56d07edd01f9..873e820e1521 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -120,13 +120,13 @@ struct page { > unsigned long private; > }; > struct { /* page_pool used by netstack */ > + unsigned long _pp_mapping_pad; > /** > * @pp_magic: magic value to avoid recycling non > * page_pool allocated pages. > */ > unsigned long pp_magic; > struct page_pool *pp; > - unsigned long _pp_mapping_pad; > unsigned long dma_addr; > atomic_long_t pp_ref_count; > }; The reason that field is called "_pp_mapping_pad" is that it's supposed to overlay the page->mapping field, so that none of the page_pool uses set a value here. Moving it breaks that assumption. Once struct netmem_desc is completely decoupled from struct page this obviously doesn't matter, but I think it does today? At least, trying to use that field for the DMA index broke things, which is why we ended up with the bit-stuffing in pp_magic... -Toke