On Mon, Aug 29, 2022 at 04:00:09PM -0700, Sidhartha Kumar wrote: > +++ b/include/linux/mm_types.h > @@ -144,6 +144,7 @@ struct page { > #ifdef CONFIG_64BIT > unsigned int compound_nr; /* 1 << compound_order */ > #endif > + unsigned long _private_1; > }; > struct { /* Second tail page of compound page */ > unsigned long _compound_pad_1; /* compound_head */ Have you tested compiling this on 32-bit? I think you need to move the _private_1 inside the ifdef CONFIG_64BIT. > @@ -251,6 +252,7 @@ struct page { > * @_total_mapcount: Do not use directly, call folio_entire_mapcount(). > * @_pincount: Do not use directly, call folio_maybe_dma_pinned(). > * @_folio_nr_pages: Do not use directly, call folio_nr_pages(). > + * @_private_1: Do not use directly, call folio_get_private_1(). > * > * A folio is a physically, virtually and logically contiguous set > * of bytes. It is a power-of-two in size, and it is aligned to that > @@ -298,6 +300,8 @@ struct folio { > #ifdef CONFIG_64BIT > unsigned int _folio_nr_pages; > #endif > + unsigned long _private_1; (but don't do that here!) The intent is that _private_1 lines up with head[1].private on 32-bit. It's a bit tricky, and I'm not sure that I'm thinking about it quite right. > }; > > #define FOLIO_MATCH(pg, fl) \ > @@ -325,6 +329,7 @@ FOLIO_MATCH(compound_mapcount, _total_mapcount); > FOLIO_MATCH(compound_pincount, _pincount); > #ifdef CONFIG_64BIT > FOLIO_MATCH(compound_nr, _folio_nr_pages); > +FOLIO_MATCH(_private_1, _private_1); > #endif > #undef FOLIO_MATCH > > @@ -370,6 +375,16 @@ static inline void *folio_get_private(struct folio *folio) > return folio->private; > } > > +static inline void folio_set_private_1(struct folio *folio, unsigned long private) > +{ > + folio->_private_1 = private; > +} > + > +static inline unsigned long folio_get_private_1(struct folio *folio) > +{ > + return folio->_private_1; > +} > + > struct page_frag_cache { > void * va; > #if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) > -- > 2.31.1 >