* Re: [PATCH v2 08/22] mm: introduce for_each_free_list()
[not found] ` <20260320-page_alloc-unmapped-v2-8-28bf1bd54f41@google.com>
@ 2026-05-11 13:46 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 13:46 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> Later patches will rearrange the free areas, but there are a couple of
> places that iterate over them with the assumption that they have the
> current structure.
>
> It seems ideally, code outside of mm should not be directly aware of
> struct free_area in the first place, but that awareness seems relatively
> harmless so just make the minimal change.
I think we should lift the code from kernel/power/snapshot.c to under mm/
eventually, ISTR discussing it somewhere recently. But doesn't have to be in
this series.
> Now instead of letting users manually iterate over the free lists, just
> provide a macro to do that. Then adopt that macro in a couple of places.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
> ---
> include/linux/mmzone.h | 7 +++++--
> kernel/power/snapshot.c | 8 ++++----
> mm/mm_init.c | 11 +++++++----
> 3 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 7bd0134c241ce..c49e3cdf4f6bb 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -177,9 +177,12 @@ static inline bool migratetype_is_mergeable(int mt)
> return mt < MIGRATE_PCPTYPES;
> }
>
> -#define for_each_migratetype_order(order, type) \
> +#define for_each_free_list(list, zone, order) \
> for (order = 0; order < NR_PAGE_ORDERS; order++) \
> - for (type = 0; type < MIGRATE_TYPES; type++)
> + for (unsigned int type = 0; \
> + list = &zone->free_area[order].free_list[type], \
> + type < MIGRATE_TYPES; \
> + type++) \
>
> extern int page_group_by_mobility_disabled;
>
> diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
> index 7dcccf378cc2f..abd33ca13eec4 100644
> --- a/kernel/power/snapshot.c
> +++ b/kernel/power/snapshot.c
> @@ -1245,8 +1245,9 @@ unsigned int snapshot_additional_pages(struct zone *zone)
> static void mark_free_pages(struct zone *zone)
> {
> unsigned long pfn, max_zone_pfn, page_count = WD_PAGE_COUNT;
> + struct list_head *free_list;
> unsigned long flags;
> - unsigned int order, t;
> + unsigned int order;
> struct page *page;
>
> if (zone_is_empty(zone))
> @@ -1270,9 +1271,8 @@ static void mark_free_pages(struct zone *zone)
> swsusp_unset_page_free(page);
> }
>
> - for_each_migratetype_order(order, t) {
> - list_for_each_entry(page,
> - &zone->free_area[order].free_list[t], buddy_list) {
> + for_each_free_list(free_list, zone, order) {
> + list_for_each_entry(page, free_list, buddy_list) {
> unsigned long i;
>
> pfn = page_to_pfn(page);
> diff --git a/mm/mm_init.c b/mm/mm_init.c
> index 969048f9b320c..f6f9455bc42b6 100644
> --- a/mm/mm_init.c
> +++ b/mm/mm_init.c
> @@ -1445,11 +1445,14 @@ static void __meminit zone_init_internals(struct zone *zone, enum zone_type idx,
>
> static void __meminit zone_init_free_lists(struct zone *zone)
> {
> - unsigned int order, t;
> - for_each_migratetype_order(order, t) {
> - INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
> + struct list_head *list;
> + unsigned int order;
> +
> + for_each_free_list(list, zone, order)
> + INIT_LIST_HEAD(list);
> +
> + for (order = 0; order < NR_PAGE_ORDERS; order++)
> zone->free_area[order].nr_free = 0;
> - }
>
> #ifdef CONFIG_UNACCEPTED_MEMORY
> INIT_LIST_HEAD(&zone->unaccepted_pages);
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback()
[not found] ` <20260320-page_alloc-unmapped-v2-9-28bf1bd54f41@google.com>
@ 2026-05-11 13:51 ` Vlastimil Babka (SUSE)
2026-05-11 16:44 ` Brendan Jackman
0 siblings, 1 reply; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 13:51 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> This function currently returns a signed integer that encodes status
> in-band, as negative numbers, along with a migratetype.
>
> This function is about to be updated to a mode where this in-band
> signaling no longer makes sense. Therefore, switch to a more
> explicit/verbose style that encodes the status and migratetype
> separately.
>
> In the spirit of making things more explicit, also create an enum to
> avoid using magic integer literals with special meanings. This enables
> documenting the values at their definition instead of in one of the
> callers.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 10/22] mm: introduce freetype_t
[not found] ` <20260320-page_alloc-unmapped-v2-10-28bf1bd54f41@google.com>
@ 2026-05-11 15:34 ` Vlastimil Babka (SUSE)
2026-05-11 16:49 ` Brendan Jackman
2026-05-11 18:17 ` Vlastimil Babka (SUSE)
2026-05-11 18:26 ` Vlastimil Babka (SUSE)
2 siblings, 1 reply; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 15:34 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> This is preparation for teaching the page allocator to break up free
> pages according to properties that have nothing to do with mobility. For
> example it can be used to allocate pages that are non-present in the
> physmap, or pages that are sensitive in ASI.
>
> For these usecases, certain allocator behaviours are desirable:
>
> - A "pool" of pages with the given property is usually available, so
> that pages can be provided with the correct sensitivity without
> zeroing/TLB flushing.
>
> - Pages are physically grouped by the property, so that large
> allocations rarely have to alter the pagetables due to ASI.
>
> - The properties can be forced to vary only at a certain fixed address
> granularity, so that the pagetables can all be pre-allocated. This is
> desirable because the page allocator will be changing mappings:
> pre-allocation is a straightforward way to avoid recursive allocations
> (of pagetables).
>
> It seems that the existing infrastructure for grouping pages by
> mobility, i.e. pageblocks and migratetypes, serves this purpose pretty
> nicely. However, overloading migratetype itself for this purpose looks
> like a road to maintenance hell. In particular, as soon as such
> properties become orthogonal to migratetypes, it would start to require
> "doubling" the migratetypes.
>
> Therefore, introduce a new higher-level concept, called "freetype"
> (because it is used to index "free"lists) that can encode extra
> properties, orthogonally to mobility, via flags.
>
> Since freetypes and migratetypes would be very easy to mix up, freetypes
> are (at least for now) stored in a struct typedef similar to atomic_t.
> This provides type-safety, but comes at the expense of being pretty
> annoying to code with. For instance, freetype_t cannot be compared with
> the == operator. Once this code matures, if the freetype/migratetype
> distinction gets less confusing, it might be wise to drop this
> struct and just use ints.
>
> Because this will eventually be needed from pageblock-flags.h, put this
> in its own header instead of directly in mmzone.h.
>
> To try and reduce review pain for such a churny patch, first introduce
> freetypes as nothing but an indirection over migratetypes. The helpers
> concerned with the flags are defined, but only as stubs. Convert
> everything over to using freetypes wherever they are needed to index
> freelists, but maintain references to migratetypes in code that really
> only cares specifically about mobility.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Seems mechanistic enough.
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Some nits:
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index ac077d98019f3..018622aa19006 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -422,6 +422,37 @@ bool get_pfnblock_bit(const struct page *page, unsigned long pfn,
> return test_bit(bitidx + pb_bit, bitmap_word);
> }
>
> +/**
> + * __get_pfnblock_freetype - Return the freetype of a pageblock, optionally
> + * ignoring the fact that it's currently isolated.
> + * @page: The page within the block of interest
> + * @pfn: The target page frame number
> + * @ignore_iso: If isolated, return the migratetype that the block had before
> + * isolation.
> + */
> +__always_inline freetype_t
'static' too?
> +__get_pfnblock_freetype(const struct page *page, unsigned long pfn,
> + bool ignore_iso)
> +{
> + int mt = get_pfnblock_migratetype(page, pfn);
> +
> + return migrate_to_freetype(mt, 0);
> +}
> +
> +/**
> + * get_pfnblock_migratetype - Return the freetype of a pageblock
> + * @page: The page within the block of interest
> + * @pfn: The target page frame number
> + *
> + * Return: The freetype of the pageblock
> + */
> +__always_inline freetype_t
And this is declared in a header so the __always_inline is not really
applicable?
(seems we should fix up get_pfnblock_migratetype too)
> +get_pfnblock_freetype(const struct page *page, unsigned long pfn)
> +{
> + return __get_pfnblock_freetype(page, pfn, 0);
> +}
> +
> +
> /**
> * get_pfnblock_migratetype - Return the migratetype of a pageblock
> * @page: The page within the block of interest
> @@ -2262,10 +2323,18 @@ find_suitable_fallback(struct free_area *area, unsigned int order,
>
> for (i = 0; i < MIGRATE_PCPTYPES - 1 ; i++) {
> int fallback_mt = fallbacks[migratetype][i];
> + /*
> + * Fallback to different migratetypes, but currently always with
> + * the same freetype flags.
> + */
> + freetype_t fallback_ft = freetype_with_migrate(freetype, fallback_mt);
>
> - if (!free_area_empty(area, fallback_mt)) {
> - if (mt_out)
> - *mt_out = fallback_mt;
> + if (freetype_idx(fallback_ft) < 0)
> + continue;
How can this happen? Is it preparatory?
> +
> + if (!free_area_empty(area, fallback_ft)) {
> + if (ft_out)
> + *ft_out = fallback_ft;
> return FALLBACK_FOUND;
> }
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 11/22] mm: move migratetype definitions to freetype.h
[not found] ` <20260320-page_alloc-unmapped-v2-11-28bf1bd54f41@google.com>
@ 2026-05-11 15:35 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 15:35 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, patrick.roy, Itazuri, Takahiro,
Andy Lutomirski, David Kaplan, Thomas Gleixner, Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> Since migratetypes are a sub-element of freetype, move the pure
> definitions into the new freetype.h.
>
> This will enable referring to these raw types from pageblock-flags.h.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
git coloring agrees it's just moves
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback()
2026-05-11 13:51 ` [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback() Vlastimil Babka (SUSE)
@ 2026-05-11 16:44 ` Brendan Jackman
2026-05-11 16:53 ` Vlastimil Babka (SUSE)
0 siblings, 1 reply; 14+ messages in thread
From: Brendan Jackman @ 2026-05-11 16:44 UTC (permalink / raw)
To: Vlastimil Babka (SUSE), Brendan Jackman, Borislav Petkov,
Dave Hansen, Peter Zijlstra, Andrew Morton, David Hildenbrand,
Wei Xu, Johannes Weiner, Zi Yan, Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On Mon May 11, 2026 at 1:51 PM UTC, Vlastimil Babka (SUSE) wrote:
> On 3/20/26 19:23, Brendan Jackman wrote:
>> This function currently returns a signed integer that encodes status
>> in-band, as negative numbers, along with a migratetype.
>>
>> This function is about to be updated to a mode where this in-band
>> signaling no longer makes sense. Therefore, switch to a more
>> explicit/verbose style that encodes the status and migratetype
>> separately.
>>
>> In the spirit of making things more explicit, also create an enum to
>> avoid using magic integer literals with special meanings. This enables
>> documenting the values at their definition instead of in one of the
>> callers.
>>
>> Signed-off-by: Brendan Jackman <jackmanb@google.com>
>
> Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Thanks,
This and the prior patch could arguably just be considered independent
cleanups, shall I send them on their own?
Equally if they feel like "churn" I'm happy to keep them in this
patchset.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 10/22] mm: introduce freetype_t
2026-05-11 15:34 ` [PATCH v2 10/22] mm: introduce freetype_t Vlastimil Babka (SUSE)
@ 2026-05-11 16:49 ` Brendan Jackman
2026-05-11 16:58 ` Vlastimil Babka (SUSE)
0 siblings, 1 reply; 14+ messages in thread
From: Brendan Jackman @ 2026-05-11 16:49 UTC (permalink / raw)
To: Vlastimil Babka (SUSE), Brendan Jackman, Borislav Petkov,
Dave Hansen, Peter Zijlstra, Andrew Morton, David Hildenbrand,
Wei Xu, Johannes Weiner, Zi Yan, Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On Mon May 11, 2026 at 3:34 PM UTC, Vlastimil Babka (SUSE) wrote:
>> +/**
>> + * __get_pfnblock_freetype - Return the freetype of a pageblock, optionally
>> + * ignoring the fact that it's currently isolated.
>> + * @page: The page within the block of interest
>> + * @pfn: The target page frame number
>> + * @ignore_iso: If isolated, return the migratetype that the block had before
>> + * isolation.
>> + */
>> +__always_inline freetype_t
>
> 'static' too?
Yup thanks
>
>> +__get_pfnblock_freetype(const struct page *page, unsigned long pfn,
>> + bool ignore_iso)
>> +{
>> + int mt = get_pfnblock_migratetype(page, pfn);
>> +
>> + return migrate_to_freetype(mt, 0);
>> +}
>> +
>> +/**
>> + * get_pfnblock_migratetype - Return the freetype of a pageblock
>> + * @page: The page within the block of interest
>> + * @pfn: The target page frame number
>> + *
>> + * Return: The freetype of the pageblock
>> + */
>> +__always_inline freetype_t
>
> And this is declared in a header so the __always_inline is not really
> applicable?
> (seems we should fix up get_pfnblock_migratetype too)
Um, I think it probably still forces inlining in calls within the same
translation unit?
Anyway I am pretty meh about this, I suspect humans and compilers are
equally bad at making this decision, I was just trying to be consistent
with the code it's replacing.
>> + /*
>> + * Fallback to different migratetypes, but currently always with
>> + * the same freetype flags.
>> + */
>> + freetype_t fallback_ft = freetype_with_migrate(freetype, fallback_mt);
>>
>> - if (!free_area_empty(area, fallback_mt)) {
>> - if (mt_out)
>> - *mt_out = fallback_mt;
>> + if (freetype_idx(fallback_ft) < 0)
>> + continue;
>
> How can this happen? Is it preparatory?
Oops, yeah looks like I need to clean up how this happens in the
history and clarify the commit messages.
In a later patch I add an optimisation where we avoid having freelists
for freetypes that never arise in practice. And in those cases
freetype_idx() returns -1.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback()
2026-05-11 16:44 ` Brendan Jackman
@ 2026-05-11 16:53 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 16:53 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 5/11/26 18:44, Brendan Jackman wrote:
> On Mon May 11, 2026 at 1:51 PM UTC, Vlastimil Babka (SUSE) wrote:
>> On 3/20/26 19:23, Brendan Jackman wrote:
>>> This function currently returns a signed integer that encodes status
>>> in-band, as negative numbers, along with a migratetype.
>>>
>>> This function is about to be updated to a mode where this in-band
>>> signaling no longer makes sense. Therefore, switch to a more
>>> explicit/verbose style that encodes the status and migratetype
>>> separately.
>>>
>>> In the spirit of making things more explicit, also create an enum to
>>> avoid using magic integer literals with special meanings. This enables
>>> documenting the values at their definition instead of in one of the
>>> callers.
>>>
>>> Signed-off-by: Brendan Jackman <jackmanb@google.com>
>>
>> Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
>
> Thanks,
>
> This and the prior patch could arguably just be considered independent
> cleanups, shall I send them on their own?
I guess why not, fewer patches in the patchset :) You're probably going to
need to rebase this on current mm tree anyway for the next posting?
> Equally if they feel like "churn" I'm happy to keep them in this
> patchset.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 10/22] mm: introduce freetype_t
2026-05-11 16:49 ` Brendan Jackman
@ 2026-05-11 16:58 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 16:58 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 5/11/26 18:49, Brendan Jackman wrote:
> On Mon May 11, 2026 at 3:34 PM UTC, Vlastimil Babka (SUSE) wrote:
>>> +/**
>>> + * __get_pfnblock_freetype - Return the freetype of a pageblock, optionally
>>> + * ignoring the fact that it's currently isolated.
>>> + * @page: The page within the block of interest
>>> + * @pfn: The target page frame number
>>> + * @ignore_iso: If isolated, return the migratetype that the block had before
>>> + * isolation.
>>> + */
>>> +__always_inline freetype_t
>>
>> 'static' too?
>
> Yup thanks
>
>>
>>> +__get_pfnblock_freetype(const struct page *page, unsigned long pfn,
>>> + bool ignore_iso)
>>> +{
>>> + int mt = get_pfnblock_migratetype(page, pfn);
>>> +
>>> + return migrate_to_freetype(mt, 0);
>>> +}
>>> +
>>> +/**
>>> + * get_pfnblock_migratetype - Return the freetype of a pageblock
>>> + * @page: The page within the block of interest
>>> + * @pfn: The target page frame number
>>> + *
>>> + * Return: The freetype of the pageblock
>>> + */
>>> +__always_inline freetype_t
>>
>> And this is declared in a header so the __always_inline is not really
>> applicable?
>
>> (seems we should fix up get_pfnblock_migratetype too)
>
> Um, I think it probably still forces inlining in calls within the same
> translation unit?
True but I don't think we try to do that consciously, seems like it was just
an oversight for get_pfnblock_migratetype, maybe Zi Yan remembers?
> Anyway I am pretty meh about this, I suspect humans and compilers are
> equally bad at making this decision, I was just trying to be consistent
> with the code it's replacing.
True.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 12/22] mm: add definitions for allocating unmapped pages
[not found] ` <20260320-page_alloc-unmapped-v2-12-28bf1bd54f41@google.com>
@ 2026-05-11 18:01 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:01 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, patrick.roy, Itazuri, Takahiro,
Andy Lutomirski, David Kaplan, Thomas Gleixner, Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> Create __GFP_UNMAPPED, which requests pages that are not present in the
> direct map. Since this feature has a cost (e.g. more freelists), it's
> behind a kconfig. Unlike other conditionally-defined GFP flags, it
> doesn't fall back to being 0. This prevents building code that uses
> __GFP_UNMAPPED but doesn't depend on the necessary kconfig, since that
> would lead to invisible security issues.
>
> Create a freetype flag to record that pages on the freelists with this
> flag are unmapped. This is currently only needed for MIGRATE_UNMOVABLE
> pages, so the freetype encoding remains trivial.
>
> Also create the corresponding pageblock flag to record the same thing.
>
> To keep patches from being too overwhelming, the actual implementation
> is added separately, this is just types, Kconfig boilerplate, etc.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Aside from the gfp vs internal flag decision, seems fine.
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 13/22] mm: rejig pageblock mask definitions
[not found] ` <20260320-page_alloc-unmapped-v2-13-28bf1bd54f41@google.com>
@ 2026-05-11 18:07 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:07 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> A later patch will complicate the definition of these masks, this is a
> preparatory patch to make that patch easier to review.
>
> - More masks will be needed, so add a PAGEBLOCK_ prefix to the names
> to avoid polluting the "global namespace" too much.
>
> - This makes MIGRATETYPE_AND_ISO_MASK start to look pretty long. Well,
> that global mask only exists for quite a specific purpose so just drop
> it and take advantage of the newly-defined PAGEBLOCK_ISO_MASK.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
LGTM. Could be also part of the immediate cleanup series?
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 10/22] mm: introduce freetype_t
[not found] ` <20260320-page_alloc-unmapped-v2-10-28bf1bd54f41@google.com>
2026-05-11 15:34 ` [PATCH v2 10/22] mm: introduce freetype_t Vlastimil Babka (SUSE)
@ 2026-05-11 18:17 ` Vlastimil Babka (SUSE)
2026-05-11 18:26 ` Vlastimil Babka (SUSE)
2 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:17 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, patrick.roy, Itazuri, Takahiro,
Andy Lutomirski, David Kaplan, Thomas Gleixner, Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> +/**
> + * get_pfnblock_migratetype - Return the freetype of a pageblock
Also just noticed the wrong name here
> + * @page: The page within the block of interest
> + * @pfn: The target page frame number
> + *
> + * Return: The freetype of the pageblock
> + */
> +__always_inline freetype_t
> +get_pfnblock_freetype(const struct page *page, unsigned long pfn)
> +{
> + return __get_pfnblock_freetype(page, pfn, 0);
> +}
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 10/22] mm: introduce freetype_t
[not found] ` <20260320-page_alloc-unmapped-v2-10-28bf1bd54f41@google.com>
2026-05-11 15:34 ` [PATCH v2 10/22] mm: introduce freetype_t Vlastimil Babka (SUSE)
2026-05-11 18:17 ` Vlastimil Babka (SUSE)
@ 2026-05-11 18:26 ` Vlastimil Babka (SUSE)
2 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:26 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, patrick.roy, Itazuri, Takahiro,
Andy Lutomirski, David Kaplan, Thomas Gleixner, Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -422,6 +422,37 @@ bool get_pfnblock_bit(const struct page *page, unsigned long pfn,
> return test_bit(bitidx + pb_bit, bitmap_word);
> }
>
> +/**
> + * __get_pfnblock_freetype - Return the freetype of a pageblock, optionally
> + * ignoring the fact that it's currently isolated.
> + * @page: The page within the block of interest
> + * @pfn: The target page frame number
> + * @ignore_iso: If isolated, return the migratetype that the block had before
> + * isolation.
> + */
> +__always_inline freetype_t
> +__get_pfnblock_freetype(const struct page *page, unsigned long pfn,
> + bool ignore_iso)
Hm I also noticed ignore_iso is ... ignored until later patch.
> +{
> + int mt = get_pfnblock_migratetype(page, pfn);
> +
> + return migrate_to_freetype(mt, 0);
> +}
> +
> +/**
> + * get_pfnblock_migratetype - Return the freetype of a pageblock
> + * @page: The page within the block of interest
> + * @pfn: The target page frame number
> + *
> + * Return: The freetype of the pageblock
> + */
> +__always_inline freetype_t
> +get_pfnblock_freetype(const struct page *page, unsigned long pfn)
> +{
> + return __get_pfnblock_freetype(page, pfn, 0);
And here it passes 0 to bool.
> +}
> +
> +
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 14/22] mm: encode freetype flags in pageblock flags
[not found] ` <20260320-page_alloc-unmapped-v2-14-28bf1bd54f41@google.com>
@ 2026-05-11 18:29 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:29 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, Kalyazin, Nikita, patrick.roy,
Itazuri, Takahiro, Andy Lutomirski, David Kaplan, Thomas Gleixner,
Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> In preparation for implementing allocation from FREETYPE_UNMAPPED lists.
>
> Since it works nicely with the existing allocator logic, and also offers
> a simple way to amortize TLB flushing costs, __GFP_UNMAPPED will be
> implemented by changing mappings at pageblock granularity. Therefore,
> encode the mapping state in the pageblock flags.
>
> Also add the necessary logic to record this from a freetype, and
> reconstruct a freetype from the pageblock flags.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
nit:
> @@ -434,9 +431,20 @@ __always_inline freetype_t
> __get_pfnblock_freetype(const struct page *page, unsigned long pfn,
> bool ignore_iso)
> {
> - int mt = get_pfnblock_migratetype(page, pfn);
> + unsigned long mask = PAGEBLOCK_FREETYPE_MASK;
> + enum migratetype migratetype;
> + unsigned int ft_flags;
> + unsigned long flags;
>
> - return migrate_to_freetype(mt, 0);
> + flags = __get_pfnblock_flags_mask(page, pfn, mask);
> + ft_flags = (flags & PAGEBLOCK_FREETYPE_FLAGS_MASK) >> PB_freetype_flags;
> +
> + migratetype = flags & PAGEBLOCK_MIGRATETYPE_MASK;
> +#ifdef CONFIG_MEMORY_ISOLATION
> + if (!ignore_iso && flags & BIT(PB_migrate_isolate))
(flags & BIT(PB_migrate_isolate)) ?
> + migratetype = MIGRATE_ISOLATE;
> +#endif
> + return migrate_to_freetype(migratetype, ft_flags);
> }
>
> /**
> @@ -570,6 +578,15 @@ static void set_pageblock_migratetype(struct page *page,
> PAGEBLOCK_MIGRATETYPE_MASK | PAGEBLOCK_ISO_MASK);
> }
>
> +static inline void set_pageblock_freetype_flags(struct page *page,
> + unsigned int ft_flags)
> +{
> + unsigned int flags = ft_flags << PB_freetype_flags;
> +
> + __set_pfnblock_flags_mask(page, page_to_pfn(page), flags,
> + PAGEBLOCK_FREETYPE_FLAGS_MASK);
> +}
> +
> void __meminit init_pageblock_migratetype(struct page *page,
> enum migratetype migratetype,
> bool isolate)
> @@ -593,7 +610,7 @@ void __meminit init_pageblock_migratetype(struct page *page,
> flags |= BIT(PB_migrate_isolate);
> #endif
> __set_pfnblock_flags_mask(page, page_to_pfn(page), flags,
> - PAGEBLOCK_MIGRATETYPE_MASK | PAGEBLOCK_ISO_MASK);
> + PAGEBLOCK_FREETYPE_MASK);
> }
>
> #ifdef CONFIG_DEBUG_VM
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 15/22] mm/page_alloc: remove ifdefs from pindex helpers
[not found] ` <20260320-page_alloc-unmapped-v2-15-28bf1bd54f41@google.com>
@ 2026-05-11 18:30 ` Vlastimil Babka (SUSE)
0 siblings, 0 replies; 14+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-05-11 18:30 UTC (permalink / raw)
To: Brendan Jackman, Borislav Petkov, Dave Hansen, Peter Zijlstra,
Andrew Morton, David Hildenbrand, Wei Xu, Johannes Weiner, Zi Yan,
Lorenzo Stoakes
Cc: linux-mm, linux-kernel, x86, rppt, Sumit Garg, derkling, reijiw,
Will Deacon, rientjes, patrick.roy, Itazuri, Takahiro,
Andy Lutomirski, David Kaplan, Thomas Gleixner, Yosry Ahmed
On 3/20/26 19:23, Brendan Jackman wrote:
> The ifdefs are not technically needed here, everything used here is
> always defined.
>
> They aren't doing much harm right now but a following patch will
> complicate these functions. Switching to IS_ENABLED() makes the code a
> bit less tiresome to read.
>
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Also good for prep series?
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-05-11 18:31 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260320-page_alloc-unmapped-v2-0-28bf1bd54f41@google.com>
[not found] ` <20260320-page_alloc-unmapped-v2-8-28bf1bd54f41@google.com>
2026-05-11 13:46 ` [PATCH v2 08/22] mm: introduce for_each_free_list() Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-9-28bf1bd54f41@google.com>
2026-05-11 13:51 ` [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback() Vlastimil Babka (SUSE)
2026-05-11 16:44 ` Brendan Jackman
2026-05-11 16:53 ` Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-11-28bf1bd54f41@google.com>
2026-05-11 15:35 ` [PATCH v2 11/22] mm: move migratetype definitions to freetype.h Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-12-28bf1bd54f41@google.com>
2026-05-11 18:01 ` [PATCH v2 12/22] mm: add definitions for allocating unmapped pages Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-13-28bf1bd54f41@google.com>
2026-05-11 18:07 ` [PATCH v2 13/22] mm: rejig pageblock mask definitions Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-10-28bf1bd54f41@google.com>
2026-05-11 15:34 ` [PATCH v2 10/22] mm: introduce freetype_t Vlastimil Babka (SUSE)
2026-05-11 16:49 ` Brendan Jackman
2026-05-11 16:58 ` Vlastimil Babka (SUSE)
2026-05-11 18:17 ` Vlastimil Babka (SUSE)
2026-05-11 18:26 ` Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-14-28bf1bd54f41@google.com>
2026-05-11 18:29 ` [PATCH v2 14/22] mm: encode freetype flags in pageblock flags Vlastimil Babka (SUSE)
[not found] ` <20260320-page_alloc-unmapped-v2-15-28bf1bd54f41@google.com>
2026-05-11 18:30 ` [PATCH v2 15/22] mm/page_alloc: remove ifdefs from pindex helpers Vlastimil Babka (SUSE)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox