From: Brendan Jackman 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 Signed-off-by: Gregory Price --- 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