All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brendan Jackman <jackmanb@google.com>
To: "Vlastimil Babka (SUSE)" <vbabka@kernel.org>,
	Brendan Jackman <jackmanb@google.com>,
	 Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	 Peter Zijlstra <peterz@infradead.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	 David Hildenbrand <david@kernel.org>,
	Wei Xu <weixugc@google.com>,
	 Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
	Lorenzo Stoakes <ljs@kernel.org>
Cc: <linux-mm@kvack.org>, <linux-kernel@vger.kernel.org>,
	<x86@kernel.org>,  <rppt@kernel.org>,
	Sumit Garg <sumit.garg@oss.qualcomm.com>, <derkling@google.com>,
	 <reijiw@google.com>, Will Deacon <will@kernel.org>,
	<rientjes@google.com>,
	 "Kalyazin, Nikita" <kalyazin@amazon.co.uk>,
	<patrick.roy@linux.dev>,
	 "Itazuri, Takahiro" <itazur@amazon.co.uk>,
	Andy Lutomirski <luto@kernel.org>,
	 David Kaplan <david.kaplan@amd.com>,
	Thomas Gleixner <tglx@kernel.org>, Yosry Ahmed <yosry@kernel.org>
Subject: Re: [PATCH v2 18/22] mm/page_alloc: introduce ALLOC_NOBLOCK
Date: Fri, 15 May 2026 13:36:43 +0000	[thread overview]
Message-ID: <DIJAH8TVP33G.2YWJ4Z0KO0PZJ@google.com> (raw)
In-Reply-To: <d5972a1d-42cd-4510-b734-c47b927af501@kernel.org>

On Wed May 13, 2026 at 9:43 AM UTC, Vlastimil Babka (SUSE) wrote:
> On 3/20/26 19:23, Brendan Jackman wrote:
>> This flag is set unless we can be sure the caller isn't in an atomic
>> context.
>> 
>> The allocator will soon start needing to call set_direct_map_* APIs
>> which cannot be called with IRQs off. It will need to do this even
>> before direct reclaim is possible.
>> 
>> Despite the fact that, in principle, ALLOC_NOBLOCK is distinct from
>> __GFP_DIRECT_RECLAIM, in order to avoid introducing a GFP flag, just
>> infer the former based on whether the caller set the latter. This means
>> that, in practice, ALLOC_NOBLOCK is just !__GFP_DIRECT_RECLAIM, except
>> that it is not influenced by gfp_allowed_mask. This could change later,
>> though.
>
> I don't think it should change later? We wouldn't want false positives
> during boot, or what do you have in mind?

I don't think I had anything specific in mind or any reason to _want_ to
change it. But I think (??) there are reasons to clear
__GFP_DIRECT_RECLAIM even if you are not atomic? Like some sort of
generalisation of __GFP_NOIO/NOFS. So all I'm getting at here is: I'm
using __GFP_DIRECT_RECLAIM to set ALLOC_NOBLOCK, but I think of that as
a total implementation detail and these two flags should conceptually be
decoupled.

> I wonder if the implementation of the "not influenced" is correct though...

This has been broken in several local iterations of this patchset so I
would not be surprised...

>> Call it ALLOC_NOBLOCK in order to try and mitigate confusion vs the
>> recently-removed ALLOC_NON_BLOCK, which meant something different.
>> 
>> Signed-off-by: Brendan Jackman <jackmanb@google.com>
>> ---
>>  mm/internal.h   |  1 +
>>  mm/page_alloc.c | 29 ++++++++++++++++++++++-------
>>  2 files changed, 23 insertions(+), 7 deletions(-)
>> 
>> diff --git a/mm/internal.h b/mm/internal.h
>> index cc19a90a7933f..865991aca06ea 100644
>> --- a/mm/internal.h
>> +++ b/mm/internal.h
>> @@ -1431,6 +1431,7 @@ unsigned int reclaim_clean_pages_from_list(struct zone *zone,
>>  #define ALLOC_HIGHATOMIC	0x200 /* Allows access to MIGRATE_HIGHATOMIC */
>>  #define ALLOC_TRYLOCK		0x400 /* Only use spin_trylock in allocation path */
>>  #define ALLOC_KSWAPD		0x800 /* allow waking of kswapd, __GFP_KSWAPD_RECLAIM set */
>> +#define ALLOC_NOBLOCK	       0x1000 /* Caller may be atomic */
>>  
>>  /* Flags that allow allocations below the min watermark. */
>>  #define ALLOC_RESERVES (ALLOC_HARDER|ALLOC_MIN_RESERVE|ALLOC_HIGHATOMIC|ALLOC_OOM)
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index 9a07c552a1f8a..83d06a6db6433 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -4608,6 +4608,8 @@ gfp_to_alloc_flags(gfp_t gfp_mask, unsigned int order)
>>  		(gfp_mask & (__GFP_HIGH | __GFP_KSWAPD_RECLAIM));
>>  
>>  	if (!(gfp_mask & __GFP_DIRECT_RECLAIM)) {
>> +		alloc_flags |= ALLOC_NOBLOCK;
>
> When this is called from __alloc_pages_slowpath(), gfp_allowed_mask is
> already applied, so it will be influenced.

... yep. 

I have tried to generally refactor the flag setup in here to make
these kinda mistakes harder but I didn't have any good ideas (this was
when I spotted [0]). Maybe I was being too timid, I will try again.

[0] https://lore.kernel.org/linux-mm/20260331-b4-prepare_alloc_pages-flags-v1-1-ea2416def698@google.com/

>> +
>>  		/*
>>		 * Not worth trying to allocate harder for __GFP_NOMEMALLOC even
>>  		 * if it can't schedule.
>> @@ -4801,14 +4803,13 @@ check_retry_cpuset(int cpuset_mems_cookie, struct alloc_context *ac)
>>  
>>  static inline struct page *
>>  __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
>> -						struct alloc_context *ac)
>> +		       struct alloc_context *ac, unsigned int alloc_flags)
>>  {
>>  	bool can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;
>>  	bool can_compact = can_direct_reclaim && gfp_compaction_allowed(gfp_mask);
>>  	bool nofail = gfp_mask & __GFP_NOFAIL;
>>  	const bool costly_order = order > PAGE_ALLOC_COSTLY_ORDER;
>>  	struct page *page = NULL;
>> -	unsigned int alloc_flags;
>>  	unsigned long did_some_progress;
>>  	enum compact_priority compact_priority;
>>  	enum compact_result compact_result;
>> @@ -4860,7 +4861,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
>>  	 * kswapd needs to be woken up, and to avoid the cost of setting up
>>  	 * alloc_flags precisely. So we do that now.
>>  	 */
>> -	alloc_flags = gfp_to_alloc_flags(gfp_mask, order);
>> +	alloc_flags |= gfp_to_alloc_flags(gfp_mask, order);
>
> Is it safe to just combine them? You come with ALLOC_WMARK_LOW and combine
> with ALLOC_WMARK_MIN from gfp_to_alloc_flags() but these are not bit flags,
> I think you end up with ALLOC_WMARK_LOW effectively.

Ah, thanks, I do remember thinking about this and deciding that it was
safe but I probably just misunderstood the watermark code.

This makes me a bit more attracted to the idea of a struct like Gregory
suggested in [1]. Then this could be captured in the type system.

> Probably you need to pass the old alloc_flags to gfp_to_alloc_flags, mask
> only ALLOC_NOBLOCK from it and combine with newly calculated alloc_flags. By
> not recomputing ALLOC_NOBLOCK you also avoid the problem pointed out above?

Nice, thanks for the pointer.

> (or we decide to not use gfp flag but a new function and then it's more like
> what alloc_frozen_pages_nolock_noprof() does).


  reply	other threads:[~2026-05-15 13:36 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-20 18:23 [PATCH v2 00/22] mm: Add __GFP_UNMAPPED Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 01/22] x86/mm: split out preallocate_sub_pgd() Brendan Jackman
2026-03-20 19:42   ` Dave Hansen
2026-03-23 11:01     ` Brendan Jackman
2026-03-24 15:27   ` Borislav Petkov
2026-03-25 13:28     ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 02/22] x86/mm: Generalize LDT remap into "mm-local region" Brendan Jackman
2026-03-20 19:47   ` Dave Hansen
2026-03-23 12:01     ` Brendan Jackman
2026-03-23 12:57       ` Brendan Jackman
2026-03-25 14:23   ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 03/22] x86/tlb: Expose some flush function declarations to modules Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 04/22] mm: Create flags arg for __apply_to_page_range() Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 05/22] mm: Add more flags " Brendan Jackman
2026-03-26 16:14   ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 06/22] x86/mm: introduce the mermap Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 07/22] mm: KUnit tests for " Brendan Jackman
2026-03-24  8:00   ` kernel test robot
2026-03-20 18:23 ` [PATCH v2 08/22] mm: introduce for_each_free_list() Brendan Jackman
2026-05-11 13:46   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 09/22] mm/page_alloc: don't overload migratetype in find_suitable_fallback() Brendan Jackman
2026-05-11 13:51   ` Vlastimil Babka (SUSE)
2026-05-11 16:44     ` Brendan Jackman
2026-05-11 16:53       ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 10/22] mm: introduce freetype_t Brendan Jackman
2026-05-11 15:34   ` 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)
2026-03-20 18:23 ` [PATCH v2 11/22] mm: move migratetype definitions to freetype.h Brendan Jackman
2026-05-11 15:35   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 12/22] mm: add definitions for allocating unmapped pages Brendan Jackman
2026-05-11 18:01   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 13/22] mm: rejig pageblock mask definitions Brendan Jackman
2026-05-11 18:07   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 14/22] mm: encode freetype flags in pageblock flags Brendan Jackman
2026-05-11 18:29   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 15/22] mm/page_alloc: remove ifdefs from pindex helpers Brendan Jackman
2026-05-11 18:30   ` Vlastimil Babka (SUSE)
2026-05-12  9:49     ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 16/22] mm/page_alloc: separate pcplists by freetype flags Brendan Jackman
2026-05-13  8:46   ` Vlastimil Babka (SUSE)
2026-03-20 18:23 ` [PATCH v2 17/22] mm/page_alloc: rename ALLOC_NON_BLOCK back to _HARDER Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 18/22] mm/page_alloc: introduce ALLOC_NOBLOCK Brendan Jackman
2026-05-13  9:43   ` Vlastimil Babka (SUSE)
2026-05-15 13:36     ` Brendan Jackman [this message]
2026-05-15 15:52       ` Gregory Price
2026-03-20 18:23 ` [PATCH v2 19/22] mm/page_alloc: implement __GFP_UNMAPPED allocations Brendan Jackman
2026-05-13 15:43   ` Vlastimil Babka (SUSE)
2026-05-15 16:46     ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 20/22] mm/page_alloc: implement __GFP_UNMAPPED|__GFP_ZERO allocations Brendan Jackman
2026-05-13 17:00   ` Vlastimil Babka (SUSE)
2026-05-15 16:50     ` Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 21/22] mm: Minimal KUnit tests for some new page_alloc logic Brendan Jackman
2026-03-20 18:23 ` [PATCH v2 22/22] mm/secretmem: Use __GFP_UNMAPPED when available Brendan Jackman
2026-03-31 14:40   ` Brendan Jackman
2026-05-13 16:17 ` [PATCH v2 00/22] mm: Add __GFP_UNMAPPED Gregory Price
2026-05-13 17:14   ` Brendan Jackman
2026-05-13 17:28     ` Gregory Price
2026-05-13 17:38       ` Vlastimil Babka (SUSE)
2026-05-13 17:59         ` Gregory Price
2026-05-15  9:31           ` Brendan Jackman
2026-05-15 16:04             ` Gregory Price

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DIJAH8TVP33G.2YWJ4Z0KO0PZJ@google.com \
    --to=jackmanb@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=david.kaplan@amd.com \
    --cc=david@kernel.org \
    --cc=derkling@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=itazur@amazon.co.uk \
    --cc=kalyazin@amazon.co.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ljs@kernel.org \
    --cc=luto@kernel.org \
    --cc=patrick.roy@linux.dev \
    --cc=peterz@infradead.org \
    --cc=reijiw@google.com \
    --cc=rientjes@google.com \
    --cc=rppt@kernel.org \
    --cc=sumit.garg@oss.qualcomm.com \
    --cc=tglx@kernel.org \
    --cc=vbabka@kernel.org \
    --cc=weixugc@google.com \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    --cc=yosry@kernel.org \
    --cc=ziy@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.