[RFC PATCH 3/6] mm/page_alloc: add an alloc_flags-aware folio allocator
From: Gregory Price
Date: Wed Sep 23 2026 - 17:11:36 EST
From: Brendan Jackman <brendan.jackman@xxxxxxxxxx>
The low-level page allocator accepts explicit allocator behavior flags,
but the folio helper hard-codes ALLOC_DEFAULT.
Add an MM-internal folio allocator that accepts alloc_flags. Keep the
existing exported folio and node interfaces unchanged as ALLOC_DEFAULT
wrappers.
No functional change intended.
Signed-off-by: Brendan Jackman <brendan.jackman@xxxxxxxxxx>
Signed-off-by: Gregory Price <gourry@xxxxxxxxxx>
---
mm/page_alloc.c | 14 +++++++++++---
mm/page_alloc.h | 6 ++++++
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index b4a021fad183..feb9c64efd84 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5510,13 +5510,21 @@ struct page *alloc_pages_node_noprof(int nid, gfp_t gfp_mask, unsigned int order
}
EXPORT_SYMBOL(alloc_pages_node_noprof);
-struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_nid,
- nodemask_t *nodemask)
+struct folio *__folio_alloc_flags_noprof(gfp_t gfp, unsigned int order,
+ int preferred_nid, nodemask_t *nodemask,
+ unsigned int alloc_flags)
{
struct page *page = __alloc_pages_noprof(gfp | __GFP_COMP, order,
- preferred_nid, nodemask, ALLOC_DEFAULT);
+ preferred_nid, nodemask, alloc_flags);
return page_rmappable_folio(page);
}
+
+struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order,
+ int preferred_nid, nodemask_t *nodemask)
+{
+ return __folio_alloc_flags_noprof(gfp, order, preferred_nid, nodemask,
+ ALLOC_DEFAULT);
+}
EXPORT_SYMBOL(__folio_alloc_noprof);
/*
diff --git a/mm/page_alloc.h b/mm/page_alloc.h
index b9259deddb59..986e733b586e 100644
--- a/mm/page_alloc.h
+++ b/mm/page_alloc.h
@@ -258,6 +258,12 @@ struct page *__alloc_pages_noprof(gfp_t gfp, unsigned int order, int preferred_n
nodemask_t *nodemask, unsigned int alloc_flags);
#define __alloc_pages(...) alloc_hooks(__alloc_pages_noprof(__VA_ARGS__))
+struct folio *__folio_alloc_flags_noprof(gfp_t gfp, unsigned int order,
+ int preferred_nid, nodemask_t *nodemask,
+ unsigned int alloc_flags);
+#define __folio_alloc_flags(...) \
+ alloc_hooks(__folio_alloc_flags_noprof(__VA_ARGS__))
+
extern void zone_pcp_reset(struct zone *zone);
extern void zone_pcp_disable(struct zone *zone);
extern void zone_pcp_enable(struct zone *zone);
--
2.55.0