--- > As long as the owner sets a page type first, we can allow reuse of the > lower 18 bit: sufficient to store an offset into a 64 KiB page, which > is the maximum base page size in *common* configurations (ignoring the > 256 KiB variant). Restrict it to the head page. > > We'll use that for zsmalloc next, to set a proper type while still > reusing that field to store information (offset into a base page) that > cannot go elsewhere for now. > > Fear of running out of bits for storing the actual type? Actually, we > don't need one bit per type, we could store a single value instead. > Further, we could likely limit PAGE_TYPE_BASE to a single (highest) bit. > > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> > --- > include/linux/mm_types.h | 5 +++++ > include/linux/page-flags.h | 20 ++++++++++++-------- > 2 files changed, 17 insertions(+), 8 deletions(-) > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 6b2aeba792c4..598cfedbbfa0 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -157,6 +157,11 @@ struct page { > * > * See page-flags.h for a list of page types which are currently > * stored here. > + * > + * Owners of typed folios may reuse the lower 16 bit of the > + * head page page_type field after setting the page type, > + * but must reset these 16 bit to -1 before clearing the > + * page type. > */ > unsigned int page_type; > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > index 104078afe0b1..b43e380ffa0b 100644 > --- a/include/linux/page-flags.h > +++ b/include/linux/page-flags.h > @@ -945,14 +945,18 @@ PAGEFLAG_FALSE(HasHWPoisoned, has_hwpoisoned) > */ > > #define PAGE_TYPE_BASE 0xf0000000 > -/* Reserve 0x0000007f to catch underflows of _mapcount */ > -#define PAGE_MAPCOUNT_RESERVE -128 > -#define PG_buddy 0x00000080 > -#define PG_offline 0x00000100 > -#define PG_table 0x00000200 > -#define PG_guard 0x00000400 > -#define PG_hugetlb 0x00000800 > -#define PG_slab 0x00001000 > +/* > + * Reserve 0x0000ffff to catch underflows of _mapcount and > + * allow owners that set a type to reuse the lower 16 bit for their own > + * purposes. > + */ > +#define PAGE_MAPCOUNT_RESERVE -65536 > +#define PG_buddy 0x00010000 > +#define PG_offline 0x00020000 > +#define PG_table 0x00040000 > +#define PG_guard 0x00080000 > +#define PG_hugetlb 0x00100800 Every PG_XX occupies one bit in my understanding. But why PG_hugetlb occupies two bits? > +#define PG_slab 0x00200000 > > #define PageType(page, flag) \ > ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) -- 2.25.1