Re: [PATCH v4] mm: convert page type macros to enum

Andrew Morton <[email protected]>
Newsgroups org.kernel.vger.linux-debuggers,org.kernel.vger.linux-kernel,org.kvack.linux-mm
Message-ID <[email protected]>
On Mon, 17 Jun 2024 15:14:58 -0700 Stephen Brennan <[email protected]> wrote:

> > -#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
> > +enum pagetype {
> > +	/*
> > +	 * Reserve 0xffff0000 - 0xfffffffe to catch _mapcount underflows and
> > +	 * allow owners that set a type to reuse the lower 16 bit for their own
> > +	 * purposes.
> > +	 */
> 
> This comment is a bit out of place now, because it refers to David's
> change which has not yet been applied. Maybe it should continue to read
> 
> "Reserve	0x0000007f to catch underflows of _mapcount"
> 
> until "mm: allow reuse of the lower 16 bit of the page type with an
> actual type" changes it?

Updated, thanks.

The post-Stephen code is now

/*
 * For pages that are never mapped to userspace,
 * page_type may be used.  Because it is initialised to -1, we invert the
 * sense of the bit, so __SetPageFoo *clears* the bit used for PageFoo, and
 * __ClearPageFoo *sets* the bit used for PageFoo.  We reserve a few high and
 * low bits so that an underflow or overflow of _mapcount won't be
 * mistaken for a page type value.
 */

enum pagetype {
	PG_buddy	= 0x00000080,
	PG_offline	= 0x00000100,
	PG_table	= 0x00000200,
	PG_guard	= 0x00000400,
	PG_hugetlb	= 0x00000800,
	PG_slab		= 0x00001000,

	PAGE_TYPE_BASE	= 0xf0000000,
	/* Reserve 0x0000007f to catch underflows of _mapcount */
	PAGE_MAPCOUNT_RESERVE	= -128,
};


And the post-David code is now:

/*
 * For pages that are never mapped to userspace,
 * page_type may be used.  Because it is initialised to -1, we invert the
 * sense of the bit, so __SetPageFoo *clears* the bit used for PageFoo, and
 * __ClearPageFoo *sets* the bit used for PageFoo.  We reserve a few high and
 * low bits so that an underflow or overflow of _mapcount won't be
 * mistaken for a page type value.
 */

enum pagetype {
	PG_buddy	= 0x40000000,
	PG_offline	= 0x20000000,
	PG_table	= 0x10000000,
	PG_guard	= 0x08000000,
	PG_hugetlb	= 0x04008000,
	PG_slab		= 0x02000000,

	PAGE_TYPE_BASE	= 0x80000000,

	/*
	 * Reserve 0xffff0000 - 0xfffffffe to catch _mapcount underflows and
	 * allow owners that set a type to reuse the lower 16 bit for their own
	 * purposes.
	 */
	PAGE_MAPCOUNT_RESERVE	= ~0x0000ffff,
};
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.