[PATCH v2 0/2] mm: page_alloc: fix reserve access for non-blocking requests
From: Johannes Weiner
Date: Wed Oct 28 2026 - 13:18:12 EST
Hi Andrew,
Two fixes for how non-blocking allocations interact with the
highatomic reserve. v1 was posted inside Salvatore's thread on
skipping direct reclaim and compaction for costly __GFP_NORETRY
allocations [1]. This is the same code as a standalone series, rebased
to mm-hotfixes-unstable, with the changelog clarifications from
review. Salvatore's patch is parked in mm-new behind these [2]:
mm-page_alloc-avoid-direct-reclaim-and-compaction-for-costly-__gfp_noretry-allocations.patch
Patch 1 narrows which requests may physically take highatomic pages,
patch 2 narrows which requests may count them in their watermark check.
Both are prerequisites for Salvatore's patch: it clears
__GFP_DIRECT_RECLAIM for costly __GFP_NORETRY requests, which turns
every large page cache folio allocation that reaches the slowpath into
a non-blocking one. Without patch 1, those requests may fall back to
the highatomic freelists reserved for atomic requests. Without patch
2, they count the free highatomic pages in their watermark check while
being served from regular memory, so they can consume regular
high-order blocks below the min watermark by the size of the
reserve. GFP_NOWAIT requests hit both paths today, so these are
existing problems worthy of their own stable backports; but
Salvatore's patch would widen them significantly.
Patch 2 reproduction: a GFP_NOWAIT burst under memory pressure can
drain regular free memory to zero while the highatomic reserve sits
idle. Measured on a 32G box with an anonymous working set, swap, and a
full 290M reserve, three synthetic bursts drove the 28G Normal zone's
regular free memory to 28M, 0.8M and 0.6M against a 60M min
watermark. Swapout failed its swap table allocation inside reclaim,
reclaim scanned 13M pages to free 200k, and page faults stalled for
tens to hundreds of milliseconds. With the fix the burst stops at the
min watermark and nothing else happens. This was found in review and
reproduced synthetically; it has not been observed in production.
GFP_ATOMIC order-0 requests have a milder version of the same problem:
They are entitled to the reserve but are served regular memory first,
so the fix there has to change the watermark check and the freelist
order together. Salvatore's change doesn't interact with this, though;
fixing that is left for a separate patch.
Changes since v1:
- rebased to mm-hotfixes-unstable (2026-10-27)
- 2/2: changelog states the bug was found in review and reproduced
with a synthetic burst rather than observed in production
(Vlastimil); notes the remaining GFP_ATOMIC order-0 problem as
follow-up work
- kept the ALLOC_MASK_ATOMIC check inline in rmqueue_buddy() rather
than adding a helper, as discussed: it pairs with the
ALLOC_HIGHATOMIC attempt above it, which is what makes it order-0
by construction
[1] https://lore.kernel.org/linux-mm/arFBWvzXPYrKuIYi@xxxxxxxxxxx/
[2] https://lore.kernel.org/linux-mm/20261001082152.2879289-1-dipiets@xxxxxxxxx/
mm/page_alloc.c | 4 +++-
mm/page_alloc.h | 14 ++++++++------
2 files changed, 11 insertions(+), 7 deletions(-)