diff mbox series

[v4] mm: convert page type macros to enum

Message ID 20240607202954.1198180-1-stephen.s.brennan@oracle.com (mailing list archive)
State New
Headers show
Series [v4] mm: convert page type macros to enum | expand

Commit Message

Stephen Brennan June 7, 2024, 8:29 p.m. UTC
Changing PG_slab from a page flag to a page type in commit 46df8e73a4a3
("mm: free up PG_slab") in has the unintended consequence of removing
the PG_slab constant from kernel debuginfo. The commit does add the
value to the vmcoreinfo note, which allows debuggers to find the value
without hardcoding it. However it's most flexible to continue
representing the constant with an enum. To that end, convert the page
type fields into an enum. Debuggers will now be able to detect that
PG_slab's type has changed from enum pageflags to enum pagetype.

Fixes: 46df8e73a4a3 ("mm: free up PG_slab")

Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>
---
v3 -> v4: rename to enum pagetype, avoiding conflict in f2fs.h and matching
          the name of enum pageflags
v2 -> v3: rebase on mm-unstable
v1 -> v2: include PAGE_TYPE_BASE and PAGE_MAPCOUNT_RESERVE

 include/linux/page-flags.h | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)

Comments

Andrew Morton June 8, 2024, 4:27 a.m. UTC | #1
On Fri,  7 Jun 2024 13:29:53 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:

> Changing PG_slab from a page flag to a page type in commit 46df8e73a4a3
> ("mm: free up PG_slab") in has the unintended consequence of removing
> the PG_slab constant from kernel debuginfo. The commit does add the
> value to the vmcoreinfo note, which allows debuggers to find the value
> without hardcoding it. However it's most flexible to continue
> representing the constant with an enum. To that end, convert the page
> type fields into an enum. Debuggers will now be able to detect that
> PG_slab's type has changed from enum pageflags to enum pagetype.
> 
> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")

Should we backport this into 6.9.x?
Stephen Brennan June 10, 2024, 10:41 p.m. UTC | #2
Andrew Morton <akpm@linux-foundation.org> writes:

> On Fri,  7 Jun 2024 13:29:53 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:
>
>> Changing PG_slab from a page flag to a page type in commit 46df8e73a4a3
>> ("mm: free up PG_slab") in has the unintended consequence of removing
>> the PG_slab constant from kernel debuginfo. The commit does add the
>> value to the vmcoreinfo note, which allows debuggers to find the value
>> without hardcoding it. However it's most flexible to continue
>> representing the constant with an enum. To that end, convert the page
>> type fields into an enum. Debuggers will now be able to detect that
>> PG_slab's type has changed from enum pageflags to enum pagetype.
>> 
>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
>
> Should we backport this into 6.9.x?

Hi Andrew,

Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of
enum pageflags in 6.9. From the perspective of the issue which motivated
this patch, there's no reason to backport.

Backporting could make the other enum pagetype constants available in
6.9, but I'm not sure there are any users who would care for that. I'd
say there's no need.

Thanks,
Stephen
Vlastimil Babka June 11, 2024, 1:07 p.m. UTC | #3
On 6/7/24 10:29 PM, Stephen Brennan wrote:
> Changing PG_slab from a page flag to a page type in commit 46df8e73a4a3
> ("mm: free up PG_slab") in has the unintended consequence of removing
> the PG_slab constant from kernel debuginfo. The commit does add the
> value to the vmcoreinfo note, which allows debuggers to find the value
> without hardcoding it. However it's most flexible to continue
> representing the constant with an enum. To that end, convert the page
> type fields into an enum. Debuggers will now be able to detect that
> PG_slab's type has changed from enum pageflags to enum pagetype.
> 
> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
> 
> Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com>

Acked-by: Vlastimil Babka <vbabka@suse.cz>

> ---
> v3 -> v4: rename to enum pagetype, avoiding conflict in f2fs.h and matching
>           the name of enum pageflags
> v2 -> v3: rebase on mm-unstable
> v1 -> v2: include PAGE_TYPE_BASE and PAGE_MAPCOUNT_RESERVE
> 
>  include/linux/page-flags.h | 31 +++++++++++++++++--------------
>  1 file changed, 17 insertions(+), 14 deletions(-)
> 
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index f04fea86324d9..32722c6e8397b 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -945,20 +945,23 @@ PAGEFLAG_FALSE(HasHWPoisoned, has_hwpoisoned)
>   * mistaken for a page type value.
>   */
>  
> -#define 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.
> - */
> -#define PG_buddy	0x40000000
> -#define PG_offline	0x20000000
> -#define PG_table	0x10000000
> -#define PG_guard	0x08000000
> -#define PG_hugetlb	0x04000000
> -#define PG_slab		0x02000000
> -#define PG_zsmalloc	0x01000000
> -#define PAGE_MAPCOUNT_RESERVE	(~0x0000ffff)
> +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.
> +	 */
> +	PG_buddy	= 0x40000000,
> +	PG_offline	= 0x20000000,
> +	PG_table	= 0x10000000,
> +	PG_guard	= 0x08000000,
> +	PG_hugetlb	= 0x04000000,
> +	PG_slab		= 0x02000000,
> +	PG_zsmalloc	= 0x01000000,
> +
> +	PAGE_TYPE_BASE	= 0x80000000,
> +	PAGE_MAPCOUNT_RESERVE	= ~0x0000ffff,
> +};
>  
>  #define PageType(page, flag)						\
>  	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
Stephen Brennan June 17, 2024, 8:34 p.m. UTC | #4
Stephen Brennan <stephen.s.brennan@oracle.com> writes:
> Andrew Morton <akpm@linux-foundation.org> writes:
>
>> On Fri,  7 Jun 2024 13:29:53 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:
>>
>>> Changing PG_slab from a page flag to a page type in commit 46df8e73a4a3
>>> ("mm: free up PG_slab") in has the unintended consequence of removing
>>> the PG_slab constant from kernel debuginfo. The commit does add the
>>> value to the vmcoreinfo note, which allows debuggers to find the value
>>> without hardcoding it. However it's most flexible to continue
>>> representing the constant with an enum. To that end, convert the page
>>> type fields into an enum. Debuggers will now be able to detect that
>>> PG_slab's type has changed from enum pageflags to enum pagetype.
>>> 
>>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
>>
>> Should we backport this into 6.9.x?
>
> Hi Andrew,
>
> Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
> the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of

Hi Andrew,

I saw that you've merged this into mm-unstable, thank you!

Since 46df8e73a4a3 ("mm: free up PG_slab") is part of the current 6.10
RC, it would be great if this patch could be part of the 6.10 release so
we don't release a kernel missing the PG_slab info.

Can you confirm if mm-unstable will get merged in this release cycle? Or
else, would it be possible to include it in a branch that will?

Thanks,
Stephen

> enum pageflags in 6.9. From the perspective of the issue which motivated
> this patch, there's no reason to backport.
>
> Backporting could make the other enum pagetype constants available in
> 6.9, but I'm not sure there are any users who would care for that. I'd
> say there's no need.
>
> Thanks,
> Stephen
Andrew Morton June 17, 2024, 8:59 p.m. UTC | #5
On Mon, 17 Jun 2024 13:34:21 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:

> >>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
> >>
> >> Should we backport this into 6.9.x?
> >
> > Hi Andrew,
> >
> > Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
> > the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of
> 
> Hi Andrew,
> 
> I saw that you've merged this into mm-unstable, thank you!
> 
> Since 46df8e73a4a3 ("mm: free up PG_slab") is part of the current 6.10
> RC, it would be great if this patch could be part of the 6.10 release so
> we don't release a kernel missing the PG_slab info.
> 
> Can you confirm if mm-unstable will get merged in this release cycle? Or
> else, would it be possible to include it in a branch that will?

OK, thanks, I moved it into mm-hotfixes-unstable for a 6.10-rcX merge.
Andrew Morton June 17, 2024, 9:29 p.m. UTC | #6
On Mon, 17 Jun 2024 13:34:21 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:

> >>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
> >>
> >> Should we backport this into 6.9.x?
> >
> > Hi Andrew,
> >
> > Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
> > the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of
> 
> Hi Andrew,
> 
> I saw that you've merged this into mm-unstable, thank you!
> 
> Since 46df8e73a4a3 ("mm: free up PG_slab") is part of the current 6.10
> RC, it would be great if this patch could be part of the 6.10 release so
> we don't release a kernel missing the PG_slab info.
> 
> Can you confirm if mm-unstable will get merged in this release cycle? Or
> else, would it be possible to include it in a branch that will?

Turns out the patch as sent was based on David's "mm: allow reuse of
the lower 16 bit of the page type with an actual type", which changed
the page flags a lot,  I redid this patch thusly:

--- a/include/linux/page-flags.h~mm-convert-page-type-macros-to-enum
+++ a/include/linux/page-flags.h
@@ -944,15 +944,22 @@ PAGEFLAG_FALSE(HasHWPoisoned, has_hwpois
  * mistaken for a page type value.
  */
 
-#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.
+	 */
+	PG_buddy	= 0x00000080,
+	PG_offline	= 0x00000100,
+	PG_table	= 0x00000200,
+	PG_guard	= 0x00000400,
+	PG_hugetlb	= 0x00000800,
+	PG_slab		= 0x00001000,
+
+	PAGE_TYPE_BASE	= 0xf0000000,
+	PAGE_MAPCOUNT_RESERVE	= -128,
+};
 
 #define PageType(page, flag)						\
 	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
Stephen Brennan June 17, 2024, 10:14 p.m. UTC | #7
Andrew Morton <akpm@linux-foundation.org> writes:
> On Mon, 17 Jun 2024 13:34:21 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:
>
>> >>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
>> >>
>> >> Should we backport this into 6.9.x?
>> >
>> > Hi Andrew,
>> >
>> > Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
>> > the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of
>> 
>> Hi Andrew,
>> 
>> I saw that you've merged this into mm-unstable, thank you!
>> 
>> Since 46df8e73a4a3 ("mm: free up PG_slab") is part of the current 6.10
>> RC, it would be great if this patch could be part of the 6.10 release so
>> we don't release a kernel missing the PG_slab info.
>> 
>> Can you confirm if mm-unstable will get merged in this release cycle? Or
>> else, would it be possible to include it in a branch that will?
>
> Turns out the patch as sent was based on David's "mm: allow reuse of
> the lower 16 bit of the page type with an actual type", which changed
> the page flags a lot,  I redid this patch thusly:
>
> --- a/include/linux/page-flags.h~mm-convert-page-type-macros-to-enum
> +++ a/include/linux/page-flags.h
> @@ -944,15 +944,22 @@ PAGEFLAG_FALSE(HasHWPoisoned, has_hwpois
>   * mistaken for a page type value.
>   */
>  
> -#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?

> +	PG_buddy	= 0x00000080,
> +	PG_offline	= 0x00000100,
> +	PG_table	= 0x00000200,
> +	PG_guard	= 0x00000400,
> +	PG_hugetlb	= 0x00000800,
> +	PG_slab		= 0x00001000,
> +
> +	PAGE_TYPE_BASE	= 0xf0000000,
> +	PAGE_MAPCOUNT_RESERVE	= -128,
> +};
>  
>  #define PageType(page, flag)						\
>  	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
> _
>
> (please check carefully)

The rest looks great, and otherwise equivalent to the v2 I sent which
was based on the master branch at the time:
https://lore.kernel.org/linux-mm/20240606182630.851750-1-stephen.s.brennan@oracle.com/

Reviewed-by: Stephen Brennan <stephen.s.brennan@oracle.com>

In case you'd like the tag.

> and David's later "mm: allow reuse of the lower 16 bit of the page type
> with an actual type" becomes 
>
>  include/linux/mm_types.h   |    5 +++++
>  include/linux/page-flags.h |   16 ++++++++--------
>  2 files changed, 13 insertions(+), 8 deletions(-)
>
> --- a/include/linux/mm_types.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type
> +++ a/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;
>  
> --- a/include/linux/page-flags.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type
> +++ a/include/linux/page-flags.h
> @@ -951,15 +951,15 @@ enum pagetype {
>  	 * allow owners that set a type to reuse the lower 16 bit for their own
>  	 * purposes.
>  	 */
> -	PG_buddy	= 0x00000080,
> -	PG_offline	= 0x00000100,
> -	PG_table	= 0x00000200,
> -	PG_guard	= 0x00000400,
> -	PG_hugetlb	= 0x00000800,
> -	PG_slab		= 0x00001000,
> +	PG_buddy	= 0x40000000,
> +	PG_offline	= 0x20000000,
> +	PG_table	= 0x10000000,
> +	PG_guard	= 0x08000000,
> +	PG_hugetlb	= 0x04008000,
> +	PG_slab		= 0x02000000,
>  
> -	PAGE_TYPE_BASE	= 0xf0000000,
> -	PAGE_MAPCOUNT_RESERVE	= -128,
> +	PAGE_TYPE_BASE	= 0x80000000,
> +	PAGE_MAPCOUNT_RESERVE	=  (~0x0000ffff),
>  };
>  
>  #define PageType(page, flag)						\
> _
>
> and that patch's fixup becomes
>
> --- a/include/linux/page-flags.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type-fix
> +++ a/include/linux/page-flags.h
> @@ -955,7 +955,7 @@ enum pagetype {
>  	PG_offline	= 0x20000000,
>  	PG_table	= 0x10000000,
>  	PG_guard	= 0x08000000,
> -	PG_hugetlb	= 0x04008000,
> +	PG_hugetlb	= 0x04000000,
>  	PG_slab		= 0x02000000,
>  
>  	PAGE_TYPE_BASE	= 0x80000000,
> _
>
> and "mm/zsmalloc: use a proper page type" becomes, in part,
>
> --- a/include/linux/page-flags.h~mm-zsmalloc-use-a-proper-page-type
> +++ a/include/linux/page-flags.h
> @@ -957,6 +957,7 @@ enum pagetype {
>  	PG_guard	= 0x08000000,
>  	PG_hugetlb	= 0x04000000,
>  	PG_slab		= 0x02000000,
> +	PG_zsmalloc	= 0x01000000,
>  
>  	PAGE_TYPE_BASE	= 0x80000000,
>  	PAGE_MAPCOUNT_RESERVE	=  (~0x0000ffff),
>
>
>
> and the end result is identical to yesterday's mm-everything so that's
> all good.
>
> However I wouldn't want to send the altered version of "mm: convert
> page type macros to enum" into 6.10-rcX because it gets so altered by
> David's mm-unstable changes for the next merge window.  The new version
> of the hotfixes patch won't have had any valid testing on its own.
>
> So I'll temporarily drop David's "mm: page_type, zsmalloc and
> page_mapcount_reset()" series from mm-unstable.  To permit the new "mm:
> convert page type macros to enum" to get some linux-next exposure. 
> David, please remind me to restore that series in a week or so?

Sorry for all the shuffling, and thank you very much for helping out on
this.

Thanks,
Stephen
David Hildenbrand June 18, 2024, 6:35 a.m. UTC | #8
On 17.06.24 23:29, Andrew Morton wrote:
> On Mon, 17 Jun 2024 13:34:21 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> wrote:
> 
>>>>> Fixes: 46df8e73a4a3 ("mm: free up PG_slab")
>>>>
>>>> Should we backport this into 6.9.x?
>>>
>>> Hi Andrew,
>>>
>>> Looks like commit 46df8e73a4a3 ("mm: free up PG_slab") is introduced in
>>> the v6.10-rc's, and not backported to 6.9. So PG_slab is still part of
>>
>> Hi Andrew,
>>
>> I saw that you've merged this into mm-unstable, thank you!
>>
>> Since 46df8e73a4a3 ("mm: free up PG_slab") is part of the current 6.10
>> RC, it would be great if this patch could be part of the 6.10 release so
>> we don't release a kernel missing the PG_slab info.
>>
>> Can you confirm if mm-unstable will get merged in this release cycle? Or
>> else, would it be possible to include it in a branch that will?
> 
> Turns out the patch as sent was based on David's "mm: allow reuse of
> the lower 16 bit of the page type with an actual type", which changed
> the page flags a lot,  I redid this patch thusly:
> 
> --- a/include/linux/page-flags.h~mm-convert-page-type-macros-to-enum
> +++ a/include/linux/page-flags.h
> @@ -944,15 +944,22 @@ PAGEFLAG_FALSE(HasHWPoisoned, has_hwpois
>    * mistaken for a page type value.
>    */
>   
> -#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.
> +	 */

As noted, we better maintain the original comment here.

> +	PG_buddy	= 0x00000080,
> +	PG_offline	= 0x00000100,
> +	PG_table	= 0x00000200,
> +	PG_guard	= 0x00000400,
> +	PG_hugetlb	= 0x00000800,
> +	PG_slab		= 0x00001000,
> +
> +	PAGE_TYPE_BASE	= 0xf0000000,
> +	PAGE_MAPCOUNT_RESERVE	= -128,
> +};
>   
>   #define PageType(page, flag)						\
>   	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
> _
>

Apart from that LGTM.


> (please check carefully)
> 
> and David's later "mm: allow reuse of the lower 16 bit of the page type
> with an actual type" becomes
> 
>   include/linux/mm_types.h   |    5 +++++
>   include/linux/page-flags.h |   16 ++++++++--------
>   2 files changed, 13 insertions(+), 8 deletions(-)
> 
> --- a/include/linux/mm_types.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type
> +++ a/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;
>   
> --- a/include/linux/page-flags.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type
> +++ a/include/linux/page-flags.h
> @@ -951,15 +951,15 @@ enum pagetype {
>   	 * allow owners that set a type to reuse the lower 16 bit for their own
>   	 * purposes.
>   	 */
> -	PG_buddy	= 0x00000080,
> -	PG_offline	= 0x00000100,
> -	PG_table	= 0x00000200,
> -	PG_guard	= 0x00000400,
> -	PG_hugetlb	= 0x00000800,
> -	PG_slab		= 0x00001000,
> +	PG_buddy	= 0x40000000,
> +	PG_offline	= 0x20000000,
> +	PG_table	= 0x10000000,
> +	PG_guard	= 0x08000000,
> +	PG_hugetlb	= 0x04008000,
> +	PG_slab		= 0x02000000,
>   
> -	PAGE_TYPE_BASE	= 0xf0000000,
> -	PAGE_MAPCOUNT_RESERVE	= -128,
> +	PAGE_TYPE_BASE	= 0x80000000,
> +	PAGE_MAPCOUNT_RESERVE	=  (~0x0000ffff),
>   };
>   
>   #define PageType(page, flag)						\
> _
> 
> and that patch's fixup becomes
> 
> --- a/include/linux/page-flags.h~mm-allow-reuse-of-the-lower-16-bit-of-the-page-type-with-an-actual-type-fix
> +++ a/include/linux/page-flags.h
> @@ -955,7 +955,7 @@ enum pagetype {
>   	PG_offline	= 0x20000000,
>   	PG_table	= 0x10000000,
>   	PG_guard	= 0x08000000,
> -	PG_hugetlb	= 0x04008000,
> +	PG_hugetlb	= 0x04000000,
>   	PG_slab		= 0x02000000,
>   
>   	PAGE_TYPE_BASE	= 0x80000000,
> _
> 
> and "mm/zsmalloc: use a proper page type" becomes, in part,
> 
> --- a/include/linux/page-flags.h~mm-zsmalloc-use-a-proper-page-type
> +++ a/include/linux/page-flags.h
> @@ -957,6 +957,7 @@ enum pagetype {
>   	PG_guard	= 0x08000000,
>   	PG_hugetlb	= 0x04000000,
>   	PG_slab		= 0x02000000,
> +	PG_zsmalloc	= 0x01000000,
>   
>   	PAGE_TYPE_BASE	= 0x80000000,
>   	PAGE_MAPCOUNT_RESERVE	=  (~0x0000ffff),
> 
> 
> 
> and the end result is identical to yesterday's mm-everything so that's
> all good.

Looks good.

> 
> However I wouldn't want to send the altered version of "mm: convert
> page type macros to enum" into 6.10-rcX because it gets so altered by
> David's mm-unstable changes for the next merge window.  The new version
> of the hotfixes patch won't have had any valid testing on its own.
> 
> So I'll temporarily drop David's "mm: page_type, zsmalloc and
> page_mapcount_reset()" series from mm-unstable.  To permit the new "mm:
> convert page type macros to enum" to get some linux-next exposure.
> David, please remind me to restore that series in a week or so?

I'll be on vacation next week, but will try to think of it. If you want 
a resend based on the new mm-unstable state with that hotfix, let me know.
Andrew Morton June 18, 2024, 9:14 p.m. UTC | #9
On Mon, 17 Jun 2024 15:14:58 -0700 Stephen Brennan <stephen.s.brennan@oracle.com> 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,
};
diff mbox series

Patch

diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index f04fea86324d9..32722c6e8397b 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -945,20 +945,23 @@  PAGEFLAG_FALSE(HasHWPoisoned, has_hwpoisoned)
  * mistaken for a page type value.
  */
 
-#define 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.
- */
-#define PG_buddy	0x40000000
-#define PG_offline	0x20000000
-#define PG_table	0x10000000
-#define PG_guard	0x08000000
-#define PG_hugetlb	0x04000000
-#define PG_slab		0x02000000
-#define PG_zsmalloc	0x01000000
-#define PAGE_MAPCOUNT_RESERVE	(~0x0000ffff)
+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.
+	 */
+	PG_buddy	= 0x40000000,
+	PG_offline	= 0x20000000,
+	PG_table	= 0x10000000,
+	PG_guard	= 0x08000000,
+	PG_hugetlb	= 0x04000000,
+	PG_slab		= 0x02000000,
+	PG_zsmalloc	= 0x01000000,
+
+	PAGE_TYPE_BASE	= 0x80000000,
+	PAGE_MAPCOUNT_RESERVE	= ~0x0000ffff,
+};
 
 #define PageType(page, flag)						\
 	((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)