Re: [PATCH v3 24/26] mm/page_alloc: always direct compact for unmapped allocs
From: Brendan Jackman
Date: Sat Aug 15 2026 - 10:44:37 EST
On Mon Aug 3, 2026 at 10:44 AM BST, Vlastimil Babka (SUSE) wrote:
> On 7/27/26 00:22, Brendan Jackman wrote:
>> This is the minimal solution for ensuring that compaction can service
>> unmapped allocations. Without this, it's possible for compaction to just
>> check watermarks and see plenty of free pages, without being aware of
>> the direct map state, and thereby cause an ALLOC_UNMAPPED allocation to
>> fail unnecessarily.
>>
>> Instead, with this change, promote compact_order to pageblock order for
>> unmapped allocations, much like defrag_mode. Then, check specifically in
>> compaction for the presence of wholly mapped blocks that can be unmapped
>> once direct compact is complete.
>>
>> This all takes advantage of a major simplification: since unmapped
>> blocks are currently always unmovable, this can be asymmetric. There is
>> never a need to promote a !ALLOC_UNMAPPED allocation to compacting at
>> pageblock_order, because compaction would be trying to generate a
>> currently-unmapped block to map; that will always fail because it would
>> require migrating unmapped pages, which is not supported at the moment.
>>
>> Signed-off-by: Brendan Jackman <jackmanb@xxxxxxxxxx>
>
> Reviewed-by: Vlastimil Babka (SUSE) <vbabka@xxxxxxxxxx>
>
> Nit:
>
>> ---
>> mm/compaction.c | 22 ++++++++++++++++++----
>> mm/page_alloc.c | 9 +++++++++
>> 2 files changed, 27 insertions(+), 4 deletions(-)
>>
>> diff --git a/mm/compaction.c b/mm/compaction.c
>> index ed12d2fc6fad3..fe1aaf293bbce 100644
>> --- a/mm/compaction.c
>> +++ b/mm/compaction.c
>> @@ -2531,12 +2531,25 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
>> static enum compact_result
>> compaction_suit_allocation_order(struct zone *zone, unsigned int order,
>> int highest_zoneidx, unsigned int alloc_flags,
>> - bool async, bool kcompactd)
>> + bool unmapped, bool async, bool kcompactd)
>
> Instead of the new bool parameter, can we check alloc_flags for ALLOC_UNMAPPED?
Lol, yes. I guess I didn't notice alloc_flags was already there :D