* + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch
@ 2026-09-11 16:32 Andrew Morton
2026-09-13 2:30 ` Matthew Wilcox
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2026-09-11 16:32 UTC (permalink / raw)
To: mm-commits, ziy, willy, vbabka, stable, ritesh.list, mhocko, hch,
hannes, dgc, david, dipiets, akpm
The patch titled
Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
has been added to the -mm mm-hotfixes-unstable branch. Its filename is
mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
This patch will later appear in the mm-hotfixes-unstable branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Salvatore Dipietro <dipiets@amazon.it>
Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
Date: Fri, 11 Sep 2026 14:21:02 +0000
Commit 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
introduced high-order folio allocations in the iomap buffered write path.
When memory is fragmented, each failed costly-order allocation enters
__alloc_pages_slowpath() which runs direct compaction and
drain_all_pages(), causing a 0.38x throughput drop on PostgreSQL pgbench
(simple-update) with 1024 clients on a 96-vCPU arm64 system.
The root issue is that direct compaction is too expensive for hot
allocation paths that have fallbacks to smaller allocations.
__filemap_get_folio_mpol() already marks higher-order allocations with
__GFP_NORETRY | __GFP_NOWARN, signalling that the caller can handle
failure. However, the page allocator still attempts full direct
compaction for costly orders with __GFP_NORETRY, which is unnecessarily
aggressive when the caller will simply retry at a lower order.
For costly-order allocations with __GFP_NORETRY, suppress direct reclaim
for the whole slowpath by computing can_direct_reclaim (and hence
can_compact) as false. The !can_direct_reclaim check near the top of the
slowpath then short-circuits to nopage: no direct reclaim, no direct
compaction and no drain_all_pages() IPI across every CPU. kswapd (and in
turn kcompactd) is still woken further down for background
defragmentation, so compaction keeps working for long-term system health
while being removed from the latency-critical direct allocation path.
Allocations that also request __GFP_THISNODE are exempted. That flag
pairing identifies the local-node-first THP attempt issued by
alloc_pages_mpol() (mempolicy.c), which relies on direct compaction to
form transparent huge pages. __GFP_NOFAIL is exempted as well, so a
must-not-fail allocation is never made to fail.
Test environment:
Hardware: AWS EC2 m8g.24xlarge (96 vCPU, arm64)
12x 1TB IO2 32000 IOPS RAID0 XFS
OS: AL2023
Kernel: v7.3-rc1
Database: PostgreSQL 18.4
Workload: pgbench simple-update, 1024 clients, 96 threads, 1200s
Results (average of 3 runs, TPS):
Config Avg TPS % vs baseline
AL2023 stock 6.1 kernel (pre-5d8edfb900d5) 136,942 n/a
v7.3-rc1 baseline (no patch) 59,408 -
v7.3-rc1 + this patch 161,994 +172.7%
The patch fully recovers the pre-5d8edfb900d5 performance, bringing
throughput back above the pre-regression level and well clear of the ~59k
baseline. The AL2023 6.1 row runs a kernel that predates commit
5d8edfb900d5 ("iomap: Copy larger chunks from userspace"), so it is not
directly comparable, but it shows the pre-regression level and confirms
that the ~59k baseline is the anomaly and not the norm.
Link: https://lore.kernel.org/all/20260403193535.9970-1-dipiets@amazon.it/T/#t [v1]
Link: https://lore.kernel.org/linux-mm/20260420161404.642-1-dipiets@amazon.it/T/#u [v2]
Link: https://lore.kernel.org/all/20260710143437.12379-1-dipiets@amazon.it/T/#u [v3]
Link: https://lore.kernel.org/all/20260904115629.3993331-1-dipiets@amazon.it/T/#u [v4]
Link: https://lore.kernel.org/20260911142102.2294202-1-dipiets@amazon.it
Fixes: 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
Signed-off-by: Salvatore Dipietro <dipiets@amazon.it>
Acked-by: Zi Yan <ziy@nvidia.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Dave Chinner <dgc@kernel.org>
Cc: Ritesh Harjani <ritesh.list@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
mm/page_alloc.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
--- a/mm/page_alloc.c~mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations
+++ a/mm/page_alloc.c
@@ -4784,10 +4784,22 @@ static inline struct page *
__alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
struct alloc_context *ac)
{
- bool can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;
+ const bool costly_order = order > PAGE_ALLOC_COSTLY_ORDER;
+ /*
+ * Costly __GFP_NORETRY callers have a cheap fallback to a lower order,
+ * so don't stall them in direct reclaim or direct compaction. Exempt
+ * __GFP_THISNODE (the THP attempt from alloc_pages_mpol() needs direct
+ * compaction) and __GFP_NOFAIL (must not be made to fail). Don't
+ * clear __GFP_DIRECT_RECLAIM from gfp_mask instead: that would also
+ * change the alloc_flags derived by alloc_flags_slowpath().
+ */
+ const bool costly_noretry = costly_order &&
+ (gfp_mask & __GFP_NORETRY) &&
+ !(gfp_mask & (__GFP_THISNODE | __GFP_NOFAIL));
+ bool can_direct_reclaim = !costly_noretry &&
+ (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;
_
Patches currently in -mm which might be from dipiets@amazon.it are
mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch
2026-09-11 16:32 + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch Andrew Morton
@ 2026-09-13 2:30 ` Matthew Wilcox
2026-09-13 4:12 ` Andrew Morton
2026-09-13 16:51 ` Johannes Weiner
0 siblings, 2 replies; 5+ messages in thread
From: Matthew Wilcox @ 2026-09-13 2:30 UTC (permalink / raw)
To: Andrew Morton
Cc: mm-commits, ziy, vbabka, stable, ritesh.list, mhocko, hch, hannes,
dgc, david, dipiets
On Fri, Sep 11, 2026 at 09:32:43AM -0700, Andrew Morton wrote:
> From: Salvatore Dipietro <dipiets@amazon.it>
> Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
> Date: Fri, 11 Sep 2026 14:21:02 +0000
>
> Commit 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
> introduced high-order folio allocations in the iomap buffered write path.
> When memory is fragmented, each failed costly-order allocation enters
> __alloc_pages_slowpath() which runs direct compaction and
> drain_all_pages(), causing a 0.38x throughput drop on PostgreSQL pgbench
> (simple-update) with 1024 clients on a 96-vCPU arm64 system.
>
> The root issue is that direct compaction is too expensive for hot
> allocation paths that have fallbacks to smaller allocations.
> __filemap_get_folio_mpol() already marks higher-order allocations with
> __GFP_NORETRY | __GFP_NOWARN, signalling that the caller can handle
> failure. However, the page allocator still attempts full direct
> compaction for costly orders with __GFP_NORETRY, which is unnecessarily
> aggressive when the caller will simply retry at a lower order.
>
> For costly-order allocations with __GFP_NORETRY, suppress direct reclaim
> for the whole slowpath by computing can_direct_reclaim (and hence
> can_compact) as false. The !can_direct_reclaim check near the top of the
> slowpath then short-circuits to nopage: no direct reclaim, no direct
> compaction and no drain_all_pages() IPI across every CPU. kswapd (and in
> turn kcompactd) is still woken further down for background
> defragmentation, so compaction keeps working for long-term system health
> while being removed from the latency-critical direct allocation path.
>
> Allocations that also request __GFP_THISNODE are exempted. That flag
> pairing identifies the local-node-first THP attempt issued by
> alloc_pages_mpol() (mempolicy.c), which relies on direct compaction to
> form transparent huge pages. __GFP_NOFAIL is exempted as well, so a
> must-not-fail allocation is never made to fail.
>
> Test environment:
> Hardware: AWS EC2 m8g.24xlarge (96 vCPU, arm64)
> 12x 1TB IO2 32000 IOPS RAID0 XFS
> OS: AL2023
> Kernel: v7.3-rc1
> Database: PostgreSQL 18.4
> Workload: pgbench simple-update, 1024 clients, 96 threads, 1200s
>
> Results (average of 3 runs, TPS):
> Config Avg TPS % vs baseline
> AL2023 stock 6.1 kernel (pre-5d8edfb900d5) 136,942 n/a
> v7.3-rc1 baseline (no patch) 59,408 -
> v7.3-rc1 + this patch 161,994 +172.7%
>
> The patch fully recovers the pre-5d8edfb900d5 performance, bringing
> throughput back above the pre-regression level and well clear of the ~59k
> baseline. The AL2023 6.1 row runs a kernel that predates commit
> 5d8edfb900d5 ("iomap: Copy larger chunks from userspace"), so it is not
> directly comparable, but it shows the pre-regression level and confirms
> that the ~59k baseline is the anomaly and not the norm.
>
> Link: https://lore.kernel.org/all/20260403193535.9970-1-dipiets@amazon.it/T/#t [v1]
> Link: https://lore.kernel.org/linux-mm/20260420161404.642-1-dipiets@amazon.it/T/#u [v2]
> Link: https://lore.kernel.org/all/20260710143437.12379-1-dipiets@amazon.it/T/#u [v3]
> Link: https://lore.kernel.org/all/20260904115629.3993331-1-dipiets@amazon.it/T/#u [v4]
> Link: https://lore.kernel.org/20260911142102.2294202-1-dipiets@amazon.it
> Fixes: 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
> Signed-off-by: Salvatore Dipietro <dipiets@amazon.it>
> Acked-by: Zi Yan <ziy@nvidia.com>
> Cc: Vlastimil Babka <vbabka@suse.cz>
> Cc: David Hildenbrand <david@redhat.com>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Matthew Wilcox <willy@infradead.org>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: Dave Chinner <dgc@kernel.org>
> Cc: Ritesh Harjani <ritesh.list@gmail.com>
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
i'm just back from vacation, but i think the patch i posted was the
better way to fic this. at this point i'm confused why this one is
being considered, but i'll review all the email from the last two weeks
and see what's happened to cause this one to be included.
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch
2026-09-13 2:30 ` Matthew Wilcox
@ 2026-09-13 4:12 ` Andrew Morton
2026-09-13 16:51 ` Johannes Weiner
1 sibling, 0 replies; 5+ messages in thread
From: Andrew Morton @ 2026-09-13 4:12 UTC (permalink / raw)
To: Matthew Wilcox
Cc: mm-commits, ziy, vbabka, stable, ritesh.list, mhocko, hch, hannes,
dgc, david, dipiets
On Sun, 13 Sep 2026 03:30:09 +0100 Matthew Wilcox <willy@infradead.org> wrote:
> > Link: https://lore.kernel.org/all/20260403193535.9970-1-dipiets@amazon.it/T/#t [v1]
> > Link: https://lore.kernel.org/linux-mm/20260420161404.642-1-dipiets@amazon.it/T/#u [v2]
> > Link: https://lore.kernel.org/all/20260710143437.12379-1-dipiets@amazon.it/T/#u [v3]
> > Link: https://lore.kernel.org/all/20260904115629.3993331-1-dipiets@amazon.it/T/#u [v4]
> > Link: https://lore.kernel.org/20260911142102.2294202-1-dipiets@amazon.it
> > Fixes: 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
> > Signed-off-by: Salvatore Dipietro <dipiets@amazon.it>
> > Acked-by: Zi Yan <ziy@nvidia.com>
> > Cc: Vlastimil Babka <vbabka@suse.cz>
> > Cc: David Hildenbrand <david@redhat.com>
> > Cc: Michal Hocko <mhocko@suse.com>
> > Cc: Johannes Weiner <hannes@cmpxchg.org>
> > Cc: Matthew Wilcox <willy@infradead.org>
> > Cc: Christoph Hellwig <hch@lst.de>
> > Cc: Dave Chinner <dgc@kernel.org>
> > Cc: Ritesh Harjani <ritesh.list@gmail.com>
> > Cc: <stable@vger.kernel.org>
> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>
> i'm just back from vacation, but i think the patch i posted was the
> better way to fic this.
whatpatchwasthat. It was like 7000 patches ago ;)
> at this point i'm confused why this one is
> being considered, but i'll review all the email from the last two weeks
> and see what's happened to cause this one to be included.
No probs, thanks for informing. I'll add a wait-for-willy note against
this one.
It already has a few notes - hannes preferred an earlier version:
https://lore.kernel.org/all/aqQlUr-1h07G8JWM@cmpxchg.org/
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch
2026-09-13 2:30 ` Matthew Wilcox
2026-09-13 4:12 ` Andrew Morton
@ 2026-09-13 16:51 ` Johannes Weiner
1 sibling, 0 replies; 5+ messages in thread
From: Johannes Weiner @ 2026-09-13 16:51 UTC (permalink / raw)
To: Matthew Wilcox
Cc: Andrew Morton, mm-commits, ziy, vbabka, stable, ritesh.list,
mhocko, hch, dgc, david, dipiets
On Sun, Sep 13, 2026 at 03:30:09AM +0100, Matthew Wilcox wrote:
> On Fri, Sep 11, 2026 at 09:32:43AM -0700, Andrew Morton wrote:
> > From: Salvatore Dipietro <dipiets@amazon.it>
> > Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
> > Date: Fri, 11 Sep 2026 14:21:02 +0000
> >
> > Commit 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
> > introduced high-order folio allocations in the iomap buffered write path.
> > When memory is fragmented, each failed costly-order allocation enters
> > __alloc_pages_slowpath() which runs direct compaction and
> > drain_all_pages(), causing a 0.38x throughput drop on PostgreSQL pgbench
> > (simple-update) with 1024 clients on a 96-vCPU arm64 system.
> >
> > The root issue is that direct compaction is too expensive for hot
> > allocation paths that have fallbacks to smaller allocations.
> > __filemap_get_folio_mpol() already marks higher-order allocations with
> > __GFP_NORETRY | __GFP_NOWARN, signalling that the caller can handle
> > failure. However, the page allocator still attempts full direct
> > compaction for costly orders with __GFP_NORETRY, which is unnecessarily
> > aggressive when the caller will simply retry at a lower order.
> >
> > For costly-order allocations with __GFP_NORETRY, suppress direct reclaim
> > for the whole slowpath by computing can_direct_reclaim (and hence
> > can_compact) as false. The !can_direct_reclaim check near the top of the
> > slowpath then short-circuits to nopage: no direct reclaim, no direct
> > compaction and no drain_all_pages() IPI across every CPU. kswapd (and in
> > turn kcompactd) is still woken further down for background
> > defragmentation, so compaction keeps working for long-term system health
> > while being removed from the latency-critical direct allocation path.
> >
> > Allocations that also request __GFP_THISNODE are exempted. That flag
> > pairing identifies the local-node-first THP attempt issued by
> > alloc_pages_mpol() (mempolicy.c), which relies on direct compaction to
> > form transparent huge pages. __GFP_NOFAIL is exempted as well, so a
> > must-not-fail allocation is never made to fail.
> >
> > Test environment:
> > Hardware: AWS EC2 m8g.24xlarge (96 vCPU, arm64)
> > 12x 1TB IO2 32000 IOPS RAID0 XFS
> > OS: AL2023
> > Kernel: v7.3-rc1
> > Database: PostgreSQL 18.4
> > Workload: pgbench simple-update, 1024 clients, 96 threads, 1200s
> >
> > Results (average of 3 runs, TPS):
> > Config Avg TPS % vs baseline
> > AL2023 stock 6.1 kernel (pre-5d8edfb900d5) 136,942 n/a
> > v7.3-rc1 baseline (no patch) 59,408 -
> > v7.3-rc1 + this patch 161,994 +172.7%
> >
> > The patch fully recovers the pre-5d8edfb900d5 performance, bringing
> > throughput back above the pre-regression level and well clear of the ~59k
> > baseline. The AL2023 6.1 row runs a kernel that predates commit
> > 5d8edfb900d5 ("iomap: Copy larger chunks from userspace"), so it is not
> > directly comparable, but it shows the pre-regression level and confirms
> > that the ~59k baseline is the anomaly and not the norm.
> >
> > Link: https://lore.kernel.org/all/20260403193535.9970-1-dipiets@amazon.it/T/#t [v1]
> > Link: https://lore.kernel.org/linux-mm/20260420161404.642-1-dipiets@amazon.it/T/#u [v2]
> > Link: https://lore.kernel.org/all/20260710143437.12379-1-dipiets@amazon.it/T/#u [v3]
> > Link: https://lore.kernel.org/all/20260904115629.3993331-1-dipiets@amazon.it/T/#u [v4]
> > Link: https://lore.kernel.org/20260911142102.2294202-1-dipiets@amazon.it
> > Fixes: 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
> > Signed-off-by: Salvatore Dipietro <dipiets@amazon.it>
> > Acked-by: Zi Yan <ziy@nvidia.com>
> > Cc: Vlastimil Babka <vbabka@suse.cz>
> > Cc: David Hildenbrand <david@redhat.com>
> > Cc: Michal Hocko <mhocko@suse.com>
> > Cc: Johannes Weiner <hannes@cmpxchg.org>
> > Cc: Matthew Wilcox <willy@infradead.org>
> > Cc: Christoph Hellwig <hch@lst.de>
> > Cc: Dave Chinner <dgc@kernel.org>
> > Cc: Ritesh Harjani <ritesh.list@gmail.com>
> > Cc: <stable@vger.kernel.org>
> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
>
> i'm just back from vacation, but i think the patch i posted was the
> better way to fic this. at this point i'm confused why this one is
> being considered, but i'll review all the email from the last two weeks
> and see what's happened to cause this one to be included.
Welcome back, Willy.
The alternate proposal didn't seem to solve Salvatore's problem:
https://lore.kernel.org/all/20260714120204.542300-1-dipiets@amazon.it/
Apologize if you were referring to something more recent, this one was
from mid-July.
^ permalink raw reply [flat|nested] 5+ messages in thread
* + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch
@ 2026-09-06 0:43 Andrew Morton
0 siblings, 0 replies; 5+ messages in thread
From: Andrew Morton @ 2026-09-06 0:43 UTC (permalink / raw)
To: mm-commits, ziy, willy, vbabka, stable, ritesh.list, mhocko, hch,
hannes, dgc, david, dipiets, akpm
The patch titled
Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
has been added to the -mm mm-hotfixes-unstable branch. Its filename is
mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
This patch will shortly appear at
https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
This patch will later appear in the mm-hotfixes-unstable branch at
git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Before you just go and hit "reply", please:
a) Consider who else should be cc'ed
b) Prefer to cc a suitable mailing list as well
c) Ideally: find the original patch on the mailing list and do a
reply-to-all to that, adding suitable additional cc's
*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***
The -mm tree is included into linux-next via various
branches at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there most days
------------------------------------------------------
From: Salvatore Dipietro <dipiets@amazon.it>
Subject: mm/page_alloc: avoid direct compaction for costly __GFP_NORETRY allocations
Date: Fri, 4 Sep 2026 11:56:28 +0000
Commit 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
introduced high-order folio allocations in the iomap buffered write path.
When memory is fragmented, each failed costly-order allocation enters
__alloc_pages_slowpath() which runs direct compaction and
drain_all_pages(), causing a 0.38x throughput drop on PostgreSQL pgbench
(simple-update) with 1024 clients on a 96-vCPU arm64 system.
The root issue is that direct compaction is too expensive for hot
allocation paths that have fallbacks to smaller allocations.
__filemap_get_folio_mpol() already marks higher-order allocations with
__GFP_NORETRY | __GFP_NOWARN, signalling that the caller can handle
failure. However, the page allocator still attempts full direct
compaction for costly orders with __GFP_NORETRY, which is unnecessarily
aggressive when the caller will simply retry at a lower order.
For costly-order allocations with __GFP_NORETRY, clear
__GFP_DIRECT_RECLAIM at the very start of the slowpath, before
can_direct_reclaim, can_compact and the nofail checks are evaluated. This
makes the entire slowpath treat the request as non-blocking: no direct
reclaim, no direct compaction and no drain_all_pages() IPI across every
CPU. kswapd (and in turn kcompactd) is still woken further down for
background defragmentation, so compaction keeps working for long-term
system health while being removed from the latency-critical direct
allocation path.
Allocations that also request __GFP_THISNODE are exempted. That flag
pairing identifies the local-node-first THP attempt issued by
alloc_pages_mpol() (mempolicy.c), which relies on direct compaction to
form transparent huge pages.
Test environment:
Hardware: AWS EC2 m8g.24xlarge (96 vCPU, arm64)
12x 1TB IO2 32000 IOPS RAID0 XFS
OS: AL2023
Kernel: v7.3-rc1
Database: PostgreSQL 18.4
Workload: pgbench simple-update, 1024 clients, 96 threads, 1200s
Results (average of 3 runs, TPS):
Config Avg TPS % vs Baseline
baseline (no patch) 59,408 -
With this patch 155,409 +161.6%
Link: https://lore.kernel.org/all/20260403193535.9970-1-dipiets@amazon.it/T/#t [v1]
Link: https://lore.kernel.org/linux-mm/20260420161404.642-1-dipiets@amazon.it/T/#u [v2]
Link: https://lore.kernel.org/all/20260710143437.12379-1-dipiets@amazon.it/T/#u [v3]
Link: https://lore.kernel.org/20260904115629.3993331-1-dipiets@amazon.it
Fixes: 5d8edfb900d5 ("iomap: Copy larger chunks from userspace")
Signed-off-by: Salvatore Dipietro <dipiets@amazon.it>
Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org>
Acked-by: Zi Yan <ziy@nvidia.com>
Reviewed-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Dave Chinner <dgc@kernel.org>
Cc: Ritesh Harjani <ritesh.list@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
mm/page_alloc.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
--- a/mm/page_alloc.c~mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations
+++ a/mm/page_alloc.c
@@ -4784,10 +4784,10 @@ static inline struct page *
__alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
struct alloc_context *ac)
{
- 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;
+ bool can_direct_reclaim;
+ bool can_compact;
+ bool nofail;
struct page *page = NULL;
unsigned int alloc_flags;
unsigned long did_some_progress;
@@ -4802,6 +4802,18 @@ __alloc_pages_slowpath(gfp_t gfp_mask, u
bool can_retry_reserves = true;
unsigned long alloc_start_time = jiffies;
+ /*
+ * Costly __GFP_NORETRY callers have a cheap fallback, so don't stall
+ * them in reclaim or compaction. __GFP_THISNODE callers are exempt.
+ */
+ if (costly_order && (gfp_mask & __GFP_NORETRY) &&
+ !(gfp_mask & __GFP_THISNODE))
+ gfp_mask &= ~__GFP_DIRECT_RECLAIM;
+
+ can_direct_reclaim = gfp_mask & __GFP_DIRECT_RECLAIM;
+ can_compact = can_direct_reclaim && gfp_compaction_allowed(gfp_mask);
+ nofail = gfp_mask & __GFP_NOFAIL;
+
if (unlikely(nofail)) {
/*
* Also we don't support __GFP_NOFAIL without __GFP_DIRECT_RECLAIM,
_
Patches currently in -mm which might be from dipiets@amazon.it are
mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-13 16:51 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-11 16:32 + mm-page_alloc-avoid-direct-compaction-for-costly-__gfp_noretry-allocations.patch added to mm-hotfixes-unstable branch Andrew Morton
2026-09-13 2:30 ` Matthew Wilcox
2026-09-13 4:12 ` Andrew Morton
2026-09-13 16:51 ` Johannes Weiner
-- strict thread matches above, loose matches on Subject: below --
2026-09-06 0:43 Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox