* [PATCH 0/3] mm: yet more cleanups for page_alloc APIs
@ 2026-07-16 14:30 Brendan Jackman
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 14:30 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev, Brendan Jackman
Based on mm-new.
Align some APIs with recent cleanups [0][1], and hide more mm-internal APIs
from public headers.
Part of this was also proposed by Vlastimil right as I was writing it:
https://lore.kernel.org/all/ed4572f4-0074-45c5-993d-7b6533eddc31@kernel.org/
And just like with my other recent patches, this has the ulterior motive
of enabling later incoming patches to add alloc_flags arguments to these
internal functions. (But, I do think these are justified as cleanups in
their own right).
[0]: https://lore.kernel.org/all/20260715-spin-trylock-followup-v3-0-fc4d246f705d@google.com/
[1]: https://lore.kernel.org/all/20260703-alloc-trylock-v5-0-c87b714e19d3@google.com/
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
Brendan Jackman (3):
mm: move internal mempolicy APIs to new internal header
mm, treewide: replace __folio_alloc_node() with folio_alloc_node()
mm: move __folio_alloc() to page_alloc.h
MAINTAINERS | 1 +
drivers/iommu/iommu-pages.c | 9 +--------
drivers/irqchip/irq-loongarch-ir.c | 4 ++--
include/linux/gfp.h | 25 +++----------------------
mm/filemap.c | 4 +++-
mm/mempolicy.c | 1 +
mm/mempolicy.h | 31 +++++++++++++++++++++++++++++++
mm/migrate.c | 2 +-
mm/page_alloc.c | 18 +++++++++++++++---
mm/page_alloc.h | 4 ++++
mm/shmem.c | 1 +
mm/swap_state.c | 1 +
net/sunrpc/svc.c | 2 +-
13 files changed, 65 insertions(+), 38 deletions(-)
---
base-commit: 512c82e906fe2c26023e307c7951d53e90910b57
change-id: 20260716-folio-alloc-cleanups-0fe319b881c2
Best regards,
--
Brendan Jackman <jackmanb@google.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] mm: move internal mempolicy APIs to new internal header
2026-07-16 14:30 [PATCH 0/3] mm: yet more cleanups for page_alloc APIs Brendan Jackman
@ 2026-07-16 14:30 ` Brendan Jackman
2026-07-16 15:22 ` Vlastimil Babka (SUSE)
2026-07-16 16:48 ` Matthew Wilcox
2026-07-16 14:30 ` [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node() Brendan Jackman
2026-07-16 14:30 ` [PATCH 3/3] mm: move __folio_alloc() to page_alloc.h Brendan Jackman
2 siblings, 2 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 14:30 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev, Brendan Jackman
There are no external users for this surface, reduce the scope.
Ulterior motive: a later patch will add an alloc_flags arg to some parts
of this.
Note it might seem like this could just go in internal.h, since it's
pretty small, but actually it will eventually need to import
page_alloc.h, we don't want to import that from internal.h so best to
proactively created this header now.
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
MAINTAINERS | 1 +
include/linux/gfp.h | 9 ---------
mm/filemap.c | 2 ++
mm/mempolicy.c | 1 +
mm/mempolicy.h | 31 +++++++++++++++++++++++++++++++
mm/shmem.c | 1 +
mm/swap_state.c | 1 +
7 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 8813d5d7eb0c1..9cde99c259639 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17068,6 +17068,7 @@ F: include/uapi/linux/mempolicy.h
F: include/linux/migrate.h
F: include/linux/migrate_mode.h
F: mm/mempolicy.c
+F: mm/mempolicy.h
F: mm/migrate.c
F: mm/migrate_device.c
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index 872bc53f32ec8..e4e974a6e5f90 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -11,7 +11,6 @@
#include <linux/sched.h>
struct vm_area_struct;
-struct mempolicy;
/* Helper macro to avoid gfp flags if they are the default one */
#define __default_gfp(a,b,...) b
@@ -274,8 +273,6 @@ struct page *alloc_pages_node_noprof(int nid, gfp_t gfp_mask, unsigned int order
#ifdef CONFIG_NUMA
struct page *alloc_pages_noprof(gfp_t gfp, unsigned int order);
struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order);
-struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
- struct mempolicy *mpol, pgoff_t ilx, int nid);
struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, struct vm_area_struct *vma,
unsigned long addr);
#else
@@ -287,11 +284,6 @@ static inline struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order)
{
return __folio_alloc_node_noprof(gfp, order, numa_node_id());
}
-static inline struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
- struct mempolicy *mpol, pgoff_t ilx, int nid)
-{
- return folio_alloc_noprof(gfp, order);
-}
static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order,
struct vm_area_struct *vma, unsigned long addr)
{
@@ -301,7 +293,6 @@ static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order,
#define alloc_pages(...) alloc_hooks(alloc_pages_noprof(__VA_ARGS__))
#define folio_alloc(...) alloc_hooks(folio_alloc_noprof(__VA_ARGS__))
-#define folio_alloc_mpol(...) alloc_hooks(folio_alloc_mpol_noprof(__VA_ARGS__))
#define vma_alloc_folio(...) alloc_hooks(vma_alloc_folio_noprof(__VA_ARGS__))
#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
diff --git a/mm/filemap.c b/mm/filemap.c
index 1dbb4c6f824e9..0dd8e2a15d746 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -52,6 +52,7 @@
#include <asm/tlbflush.h>
#include "internal.h"
+#include "mempolicy.h"
#define CREATE_TRACE_POINTS
#include <trace/events/filemap.h>
@@ -63,6 +64,7 @@
#include <asm/mman.h>
+#include "mempolicy.h"
#include "swap.h"
/*
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 5720f7f54d942..31c4e9f49b5e9 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -119,6 +119,7 @@
#include <linux/memory.h>
#include "internal.h"
+#include "mempolicy.h"
#include "page_alloc.h"
/* Internal flags */
diff --git a/mm/mempolicy.h b/mm/mempolicy.h
new file mode 100644
index 0000000000000..d80fe4c559786
--- /dev/null
+++ b/mm/mempolicy.h
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * mm-internal API for mempolicy.c. Public API lives in
+ * include/linux/mempolicy.h.
+ */
+#ifndef __MM_MEMPOLICY_H
+#define __MM_MEMPOLICY_H
+
+#include <linux/gfp.h>
+#include <linux/mempolicy.h>
+
+#ifdef CONFIG_NUMA
+struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
+ struct mempolicy *mpol, pgoff_t ilx, int nid);
+#else
+static inline struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
+ struct mempolicy *mpol, pgoff_t ilx, int nid)
+{
+ return folio_alloc_noprof(gfp, order);
+}
+#endif
+
+#define folio_alloc_mpol(...) alloc_hooks(folio_alloc_mpol_noprof(__VA_ARGS__))
+
+unsigned long alloc_pages_bulk_mempolicy_noprof(gfp_t gfp,
+ unsigned long nr_pages,
+ struct page **page_array);
+#define alloc_pages_bulk_mempolicy(...) \
+ alloc_hooks(alloc_pages_bulk_mempolicy_noprof(__VA_ARGS__))
+
+#endif /* __MM_MEMPOLICY_H */
diff --git a/mm/shmem.c b/mm/shmem.c
index 5071177059a96..69f561332bb93 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -41,6 +41,7 @@
#include <linux/swapfile.h>
#include <linux/iversion.h>
#include <linux/unicode.h>
+#include "mempolicy.h"
#include "swap.h"
static struct vfsmount *shm_mnt __ro_after_init;
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 5be825911e645..8ccd03c39a407 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -24,6 +24,7 @@
#include <linux/shmem_fs.h>
#include <linux/sysctl.h>
#include "internal.h"
+#include "mempolicy.h"
#include "swap_table.h"
#include "swap.h"
--
2.54.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node()
2026-07-16 14:30 [PATCH 0/3] mm: yet more cleanups for page_alloc APIs Brendan Jackman
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
@ 2026-07-16 14:30 ` Brendan Jackman
2026-07-16 17:00 ` Brendan Jackman
2026-07-16 14:30 ` [PATCH 3/3] mm: move __folio_alloc() to page_alloc.h Brendan Jackman
2 siblings, 1 reply; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 14:30 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev, Brendan Jackman
Commit 5b584d2d22dca ("mm: remove __alloc_pages_node()") removed the __
variant of alloc_pages_node(), after users had been migrated off it,
since it just complicates the API (requiring users to handle
NUMA_NO_NODE, or risking hotplug bugs) for no real benefit.
This patch brings __folio_alloc_node() into line too for exactly the
same reasons (including the ulterior motive of freeing up the __ variant
for use as an internal API).
This time, it's done as a single patch because A) the users are fewer
and B) folio_alloc_node() does not already exist like
alloc_pages_node() did.
No functional change intended.
Suggested-by: "Vlastimil Babka (SUSE)" <vbabka@kernel.org>
Link: https://lore.kernel.org/all/ed4572f4-0074-45c5-993d-7b6533eddc31@kernel.org/
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
drivers/iommu/iommu-pages.c | 9 +--------
drivers/irqchip/irq-loongarch-ir.c | 4 ++--
include/linux/gfp.h | 12 +++---------
mm/filemap.c | 2 +-
mm/migrate.c | 2 +-
mm/page_alloc.c | 17 +++++++++++++++--
net/sunrpc/svc.c | 2 +-
7 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/drivers/iommu/iommu-pages.c b/drivers/iommu/iommu-pages.c
index 3bab175d85571..47e0759f0e0ae 100644
--- a/drivers/iommu/iommu-pages.c
+++ b/drivers/iommu/iommu-pages.c
@@ -56,14 +56,7 @@ void *iommu_alloc_pages_node_sz(int nid, gfp_t gfp, size_t size)
*/
order = get_order(size);
- /*
- * __folio_alloc_node() does not handle NUMA_NO_NODE like
- * alloc_pages_node() did.
- */
- if (nid == NUMA_NO_NODE)
- nid = numa_mem_id();
-
- folio = __folio_alloc_node(gfp | __GFP_ZERO, order, nid);
+ folio = folio_alloc_node(gfp | __GFP_ZERO, order, nid);
if (unlikely(!folio))
return NULL;
diff --git a/drivers/irqchip/irq-loongarch-ir.c b/drivers/irqchip/irq-loongarch-ir.c
index 21c649a89a706..427f7fd3cad42 100644
--- a/drivers/irqchip/irq-loongarch-ir.c
+++ b/drivers/irqchip/irq-loongarch-ir.c
@@ -384,7 +384,7 @@ static int redirect_table_init(struct redirect_desc *irde)
unsigned long *bitmap;
struct folio *folio;
- folio = __folio_alloc_node(GFP_KERNEL | __GFP_ZERO, IRD_TABLE_PAGE_ORDER, irde->node);
+ folio = folio_alloc_node(GFP_KERNEL | __GFP_ZERO, IRD_TABLE_PAGE_ORDER, irde->node);
if (!folio) {
pr_err("Node [%d] redirect table alloc pages failed!\n", irde->node);
return -ENOMEM;
@@ -410,7 +410,7 @@ static int redirect_queue_init(struct redirect_desc *irde)
struct redirect_queue *inv_queue = &irde->inv_queue;
struct folio *folio;
- folio = __folio_alloc_node(GFP_KERNEL | __GFP_ZERO, INV_QUEUE_PAGE_ORDER, irde->node);
+ folio = folio_alloc_node(GFP_KERNEL | __GFP_ZERO, INV_QUEUE_PAGE_ORDER, irde->node);
if (!folio) {
pr_err("Node [%d] invalid queue alloc pages failed!\n", irde->node);
return -ENOMEM;
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index e4e974a6e5f90..572605d84e30e 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -251,15 +251,9 @@ static inline void warn_if_node_offline(int this_node, gfp_t gfp_mask)
dump_stack();
}
-static inline
-struct folio *__folio_alloc_node_noprof(gfp_t gfp, unsigned int order, int nid)
-{
- warn_if_node_offline(nid, gfp);
+struct folio *folio_alloc_node_noprof(gfp_t gfp, unsigned int order, int nid);
- return __folio_alloc_noprof(gfp, order, nid, NULL);
-}
-
-#define __folio_alloc_node(...) alloc_hooks(__folio_alloc_node_noprof(__VA_ARGS__))
+#define folio_alloc_node(...) alloc_hooks(folio_alloc_node_noprof(__VA_ARGS__))
/*
* Allocate pages, preferring the node given as nid. When nid == NUMA_NO_NODE,
@@ -282,7 +276,7 @@ static inline struct page *alloc_pages_noprof(gfp_t gfp_mask, unsigned int order
}
static inline struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order)
{
- return __folio_alloc_node_noprof(gfp, order, numa_node_id());
+ return folio_alloc_node_noprof(gfp, order, numa_node_id());
}
static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order,
struct vm_area_struct *vma, unsigned long addr)
diff --git a/mm/filemap.c b/mm/filemap.c
index 0dd8e2a15d746..1cf91970a6850 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1007,7 +1007,7 @@ struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order,
do {
cpuset_mems_cookie = read_mems_allowed_begin();
n = cpuset_mem_spread_node();
- folio = __folio_alloc_node_noprof(gfp, order, n);
+ folio = folio_alloc_node_noprof(gfp, order, n);
} while (!folio && read_mems_allowed_retry(cpuset_mems_cookie));
return folio;
diff --git a/mm/migrate.c b/mm/migrate.c
index 222c8c15f782f..b7836b02f32db 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -2682,7 +2682,7 @@ static struct folio *alloc_misplaced_dst_folio(struct folio *src,
__GFP_NOWARN;
gfp &= ~__GFP_RECLAIM;
}
- return __folio_alloc_node(gfp, order, nid);
+ return folio_alloc_node(gfp, order, nid);
}
/*
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 37a3c1c00e169..86922270df157 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5435,12 +5435,25 @@ EXPORT_SYMBOL(alloc_pages_node_noprof);
struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_nid,
nodemask_t *nodemask)
{
- struct page *page = __alloc_pages_noprof(gfp | __GFP_COMP, order,
- preferred_nid, nodemask, ALLOC_DEFAULT);
+ struct page *page;
+
+ if (preferred_nid == NUMA_NO_NODE)
+ preferred_nid = numa_mem_id();
+
+ warn_if_node_offline(preferred_nid, gfp);
+
+ page = __alloc_pages_noprof(gfp | __GFP_COMP, order,
+ preferred_nid, nodemask, ALLOC_DEFAULT);
return page_rmappable_folio(page);
}
EXPORT_SYMBOL(__folio_alloc_noprof);
+struct folio *folio_alloc_node_noprof(gfp_t gfp, unsigned int order, int nid)
+{
+ return __folio_alloc_noprof(gfp, order, nid, NULL);
+}
+EXPORT_SYMBOL(folio_alloc_node_noprof);
+
/*
* Common helper functions. Never use with __GFP_HIGHMEM because the returned
* address cannot represent highmem pages. Use alloc_pages and then kmap if
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index ae9ec4bf34f72..74350a2e07036 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -711,7 +711,7 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node)
rqstp->rq_server = serv;
rqstp->rq_pool = pool;
- rqstp->rq_scratch_folio = __folio_alloc_node(GFP_KERNEL, 0, node);
+ rqstp->rq_scratch_folio = folio_alloc_node(GFP_KERNEL, 0, node);
if (!rqstp->rq_scratch_folio)
goto out_enomem;
--
2.54.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] mm: move __folio_alloc() to page_alloc.h
2026-07-16 14:30 [PATCH 0/3] mm: yet more cleanups for page_alloc APIs Brendan Jackman
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
2026-07-16 14:30 ` [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node() Brendan Jackman
@ 2026-07-16 14:30 ` Brendan Jackman
2 siblings, 0 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 14:30 UTC (permalink / raw)
To: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev, Brendan Jackman
This is no longer used outside of mm so reduce the scope.
Ulterior motive for the move to mm/: A later patch will add an
alloc_flags arg here.
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
include/linux/gfp.h | 4 ----
mm/page_alloc.c | 1 -
mm/page_alloc.h | 4 ++++
3 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/include/linux/gfp.h b/include/linux/gfp.h
index 572605d84e30e..17c14b8ca007d 100644
--- a/include/linux/gfp.h
+++ b/include/linux/gfp.h
@@ -203,10 +203,6 @@ static inline void arch_free_page(struct page *page, int order) { }
static inline void arch_alloc_page(struct page *page, int order) { }
#endif
-struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_nid,
- nodemask_t *nodemask);
-#define __folio_alloc(...) alloc_hooks(__folio_alloc_noprof(__VA_ARGS__))
-
unsigned long alloc_pages_bulk_noprof(gfp_t gfp, int preferred_nid,
nodemask_t *nodemask, int nr_pages,
struct page **page_array);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 86922270df157..ff8515e173e1e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5446,7 +5446,6 @@ struct folio *__folio_alloc_noprof(gfp_t gfp, unsigned int order, int preferred_
preferred_nid, nodemask, ALLOC_DEFAULT);
return page_rmappable_folio(page);
}
-EXPORT_SYMBOL(__folio_alloc_noprof);
struct folio *folio_alloc_node_noprof(gfp_t gfp, unsigned int order, int nid)
{
diff --git a/mm/page_alloc.h b/mm/page_alloc.h
index b9259deddb59d..409be31898ae7 100644
--- a/mm/page_alloc.h
+++ b/mm/page_alloc.h
@@ -258,6 +258,10 @@ 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_noprof(gfp_t gfp, unsigned int order, int preferred_nid,
+ nodemask_t *nodemask);
+#define __folio_alloc(...) alloc_hooks(__folio_alloc_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.54.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] mm: move internal mempolicy APIs to new internal header
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
@ 2026-07-16 15:22 ` Vlastimil Babka (SUSE)
2026-07-16 16:04 ` Brendan Jackman
2026-07-16 16:48 ` Matthew Wilcox
1 sibling, 1 reply; 9+ messages in thread
From: Vlastimil Babka (SUSE) @ 2026-07-16 15:22 UTC (permalink / raw)
To: Brendan Jackman, Andrew Morton, David Hildenbrand,
Lorenzo Stoakes, Liam R. Howlett, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev
On 7/16/26 16:30, Brendan Jackman wrote:
> There are no external users for this surface, reduce the scope.
>
> Ulterior motive: a later patch will add an alloc_flags arg to some parts
> of this.
>
> Note it might seem like this could just go in internal.h, since it's
> pretty small, but actually it will eventually need to import
> page_alloc.h, we don't want to import that from internal.h so best to
> proactively created this header now.
Hmm, maybe it could just go to page_alloc.h then? After all this is just
bunch of internal page allocation functions, which just take the mempolicy
pointer?
> Signed-off-by: Brendan Jackman <jackmanb@google.com>
> ---
> MAINTAINERS | 1 +
> include/linux/gfp.h | 9 ---------
> mm/filemap.c | 2 ++
> mm/mempolicy.c | 1 +
> mm/mempolicy.h | 31 +++++++++++++++++++++++++++++++
> mm/shmem.c | 1 +
> mm/swap_state.c | 1 +
> 7 files changed, 37 insertions(+), 9 deletions(-)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 8813d5d7eb0c1..9cde99c259639 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -17068,6 +17068,7 @@ F: include/uapi/linux/mempolicy.h
> F: include/linux/migrate.h
> F: include/linux/migrate_mode.h
> F: mm/mempolicy.c
> +F: mm/mempolicy.h
> F: mm/migrate.c
> F: mm/migrate_device.c
>
> diff --git a/include/linux/gfp.h b/include/linux/gfp.h
> index 872bc53f32ec8..e4e974a6e5f90 100644
> --- a/include/linux/gfp.h
> +++ b/include/linux/gfp.h
> @@ -11,7 +11,6 @@
> #include <linux/sched.h>
>
> struct vm_area_struct;
> -struct mempolicy;
>
> /* Helper macro to avoid gfp flags if they are the default one */
> #define __default_gfp(a,b,...) b
> @@ -274,8 +273,6 @@ struct page *alloc_pages_node_noprof(int nid, gfp_t gfp_mask, unsigned int order
> #ifdef CONFIG_NUMA
> struct page *alloc_pages_noprof(gfp_t gfp, unsigned int order);
> struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order);
> -struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
> - struct mempolicy *mpol, pgoff_t ilx, int nid);
> struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order, struct vm_area_struct *vma,
> unsigned long addr);
> #else
> @@ -287,11 +284,6 @@ static inline struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order)
> {
> return __folio_alloc_node_noprof(gfp, order, numa_node_id());
> }
> -static inline struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
> - struct mempolicy *mpol, pgoff_t ilx, int nid)
> -{
> - return folio_alloc_noprof(gfp, order);
> -}
> static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order,
> struct vm_area_struct *vma, unsigned long addr)
> {
> @@ -301,7 +293,6 @@ static inline struct folio *vma_alloc_folio_noprof(gfp_t gfp, int order,
>
> #define alloc_pages(...) alloc_hooks(alloc_pages_noprof(__VA_ARGS__))
> #define folio_alloc(...) alloc_hooks(folio_alloc_noprof(__VA_ARGS__))
> -#define folio_alloc_mpol(...) alloc_hooks(folio_alloc_mpol_noprof(__VA_ARGS__))
> #define vma_alloc_folio(...) alloc_hooks(vma_alloc_folio_noprof(__VA_ARGS__))
>
> #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 1dbb4c6f824e9..0dd8e2a15d746 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -52,6 +52,7 @@
>
> #include <asm/tlbflush.h>
> #include "internal.h"
> +#include "mempolicy.h"
>
> #define CREATE_TRACE_POINTS
> #include <trace/events/filemap.h>
> @@ -63,6 +64,7 @@
>
> #include <asm/mman.h>
>
> +#include "mempolicy.h"
> #include "swap.h"
>
> /*
> diff --git a/mm/mempolicy.c b/mm/mempolicy.c
> index 5720f7f54d942..31c4e9f49b5e9 100644
> --- a/mm/mempolicy.c
> +++ b/mm/mempolicy.c
> @@ -119,6 +119,7 @@
> #include <linux/memory.h>
>
> #include "internal.h"
> +#include "mempolicy.h"
> #include "page_alloc.h"
>
> /* Internal flags */
> diff --git a/mm/mempolicy.h b/mm/mempolicy.h
> new file mode 100644
> index 0000000000000..d80fe4c559786
> --- /dev/null
> +++ b/mm/mempolicy.h
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * mm-internal API for mempolicy.c. Public API lives in
> + * include/linux/mempolicy.h.
> + */
> +#ifndef __MM_MEMPOLICY_H
> +#define __MM_MEMPOLICY_H
> +
> +#include <linux/gfp.h>
> +#include <linux/mempolicy.h>
> +
> +#ifdef CONFIG_NUMA
> +struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
> + struct mempolicy *mpol, pgoff_t ilx, int nid);
> +#else
> +static inline struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
> + struct mempolicy *mpol, pgoff_t ilx, int nid)
> +{
> + return folio_alloc_noprof(gfp, order);
> +}
> +#endif
> +
> +#define folio_alloc_mpol(...) alloc_hooks(folio_alloc_mpol_noprof(__VA_ARGS__))
> +
> +unsigned long alloc_pages_bulk_mempolicy_noprof(gfp_t gfp,
> + unsigned long nr_pages,
> + struct page **page_array);
> +#define alloc_pages_bulk_mempolicy(...) \
> + alloc_hooks(alloc_pages_bulk_mempolicy_noprof(__VA_ARGS__))
> +
> +#endif /* __MM_MEMPOLICY_H */
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 5071177059a96..69f561332bb93 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -41,6 +41,7 @@
> #include <linux/swapfile.h>
> #include <linux/iversion.h>
> #include <linux/unicode.h>
> +#include "mempolicy.h"
> #include "swap.h"
>
> static struct vfsmount *shm_mnt __ro_after_init;
> diff --git a/mm/swap_state.c b/mm/swap_state.c
> index 5be825911e645..8ccd03c39a407 100644
> --- a/mm/swap_state.c
> +++ b/mm/swap_state.c
> @@ -24,6 +24,7 @@
> #include <linux/shmem_fs.h>
> #include <linux/sysctl.h>
> #include "internal.h"
> +#include "mempolicy.h"
> #include "swap_table.h"
> #include "swap.h"
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] mm: move internal mempolicy APIs to new internal header
2026-07-16 15:22 ` Vlastimil Babka (SUSE)
@ 2026-07-16 16:04 ` Brendan Jackman
0 siblings, 0 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 16:04 UTC (permalink / raw)
To: Vlastimil Babka (SUSE), Brendan Jackman, Andrew Morton,
David Hildenbrand, Lorenzo Stoakes, Liam R. Howlett,
Mike Rapoport, Suren Baghdasaryan, Michal Hocko, Johannes Weiner,
Zi Yan, Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn,
Byungchul Park, Gregory Price, Ying Huang, Alistair Popple,
Hugh Dickins, Baolin Wang, Chris Li, Kairui Song, Kemeng Shi,
Nhat Pham, Baoquan He, Barry Song, Youngjun Park,
Joerg Roedel (AMD), Will Deacon, Robin Murphy, Huacai Chen,
WANG Xuerui, Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev
On Thu Jul 16, 2026 at 3:22 PM UTC, Vlastimil Babka (SUSE) wrote:
> On 7/16/26 16:30, Brendan Jackman wrote:
>> There are no external users for this surface, reduce the scope.
>>
>> Ulterior motive: a later patch will add an alloc_flags arg to some parts
>> of this.
>>
>> Note it might seem like this could just go in internal.h, since it's
>> pretty small, but actually it will eventually need to import
>> page_alloc.h, we don't want to import that from internal.h so best to
>> proactively created this header now.
>
> Hmm, maybe it could just go to page_alloc.h then? After all this is just
> bunch of internal page allocation functions, which just take the mempolicy
> pointer?
That would work AFAICS, but I think it's quite tidy that, currently, all
functions declared in page_alloc.h are defined in page_alloc.c. This
would break that.
If you're certain you don't care about that then I could live with using
page_alloc.h.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] mm: move internal mempolicy APIs to new internal header
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
2026-07-16 15:22 ` Vlastimil Babka (SUSE)
@ 2026-07-16 16:48 ` Matthew Wilcox
2026-07-16 16:57 ` Brendan Jackman
1 sibling, 1 reply; 9+ messages in thread
From: Matthew Wilcox @ 2026-07-16 16:48 UTC (permalink / raw)
To: Brendan Jackman
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Jan Kara, Joshua Hahn, Byungchul Park, Gregory Price, Ying Huang,
Alistair Popple, Hugh Dickins, Baolin Wang, Chris Li, Kairui Song,
Kemeng Shi, Nhat Pham, Baoquan He, Barry Song, Youngjun Park,
Joerg Roedel (AMD), Will Deacon, Robin Murphy, Huacai Chen,
WANG Xuerui, Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, linux-kernel, linux-mm, linux-fsdevel,
iommu, loongarch, linux-nfs, netdev
On Thu, Jul 16, 2026 at 02:30:10PM +0000, Brendan Jackman wrote:
> There are no external users for this surface, reduce the scope.
> -struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
> - struct mempolicy *mpol, pgoff_t ilx, int nid);
Hm. So what we're saying is that allocations which respect mempolicy are
only for core mm and not for, eg, device drivers to do. Is that really
what we want to say? I don't think so, because that's inconsistent
with having just widened __filemap_get_folio_mpol to allow guest_memfd
to specify a mempolicy.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] mm: move internal mempolicy APIs to new internal header
2026-07-16 16:48 ` Matthew Wilcox
@ 2026-07-16 16:57 ` Brendan Jackman
0 siblings, 0 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 16:57 UTC (permalink / raw)
To: Matthew Wilcox, Brendan Jackman
Cc: Andrew Morton, David Hildenbrand, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Jan Kara, Joshua Hahn, Byungchul Park, Gregory Price, Ying Huang,
Alistair Popple, Hugh Dickins, Baolin Wang, Chris Li, Kairui Song,
Kemeng Shi, Nhat Pham, Baoquan He, Barry Song, Youngjun Park,
Joerg Roedel (AMD), Will Deacon, Robin Murphy, Huacai Chen,
WANG Xuerui, Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman, linux-kernel, linux-mm, linux-fsdevel,
iommu, loongarch, linux-nfs, netdev
On Thu Jul 16, 2026 at 4:48 PM UTC, Matthew Wilcox wrote:
> On Thu, Jul 16, 2026 at 02:30:10PM +0000, Brendan Jackman wrote:
>> There are no external users for this surface, reduce the scope.
>> -struct folio *folio_alloc_mpol_noprof(gfp_t gfp, unsigned int order,
>> - struct mempolicy *mpol, pgoff_t ilx, int nid);
>
> Hm. So what we're saying is that allocations which respect mempolicy are
> only for core mm and not for, eg, device drivers to do. Is that really
> what we want to say? I don't think so, because that's inconsistent
> with having just widened __filemap_get_folio_mpol to allow guest_memfd
> to specify a mempolicy.
Yeah I agree, mempolicy definitely seems like a "public concept". All
I'm saying here is this specific function doesn't have any external
users so it doesn't need to be an external header.
... With the ulterior motive that I want to add a new parameter to it
that actually _is_ mm-internal. Namely, alloc_flags, so I can add
ALLOC_UNMAPPED to implement AS_NO_DIRECT_MAP, i.e. the next iteration of
[0]. So basically this is
about trying to extend the allocator without creating a GFP flag.
So I'm envisaging if an external user arises for it later, we'd slap two
underscores on the beginning of the internal one, (with the alloc_flags
arg), and then bring back the public one as a wrapper.
Does that make sense?
[0]: https://lore.kernel.org/all/20260410151746.61150-1-kalyazin@amazon.com/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node()
2026-07-16 14:30 ` [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node() Brendan Jackman
@ 2026-07-16 17:00 ` Brendan Jackman
0 siblings, 0 replies; 9+ messages in thread
From: Brendan Jackman @ 2026-07-16 17:00 UTC (permalink / raw)
To: Brendan Jackman, Andrew Morton, David Hildenbrand,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Johannes Weiner, Zi Yan,
Matthew Wilcox (Oracle), Jan Kara, Joshua Hahn, Byungchul Park,
Gregory Price, Ying Huang, Alistair Popple, Hugh Dickins,
Baolin Wang, Chris Li, Kairui Song, Kemeng Shi, Nhat Pham,
Baoquan He, Barry Song, Youngjun Park, Joerg Roedel (AMD),
Will Deacon, Robin Murphy, Huacai Chen, WANG Xuerui,
Thomas Gleixner, Chuck Lever, Jeff Layton, NeilBrown,
Olga Kornievskaia, Dai Ngo, Tom Talpey, Trond Myklebust,
Anna Schumaker, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Simon Horman
Cc: linux-kernel, linux-mm, linux-fsdevel, iommu, loongarch,
linux-nfs, netdev
On Thu Jul 16, 2026 at 2:30 PM UTC, Brendan Jackman wrote:
> Commit 5b584d2d22dca ("mm: remove __alloc_pages_node()") removed the __
Oh, I just remembered this commit hash is unstable. In fact it's already
wrong.
> variant of alloc_pages_node(), after users had been migrated off it,
> since it just complicates the API (requiring users to handle
> NUMA_NO_NODE, or risking hotplug bugs) for no real benefit.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-16 17:00 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-16 14:30 [PATCH 0/3] mm: yet more cleanups for page_alloc APIs Brendan Jackman
2026-07-16 14:30 ` [PATCH 1/3] mm: move internal mempolicy APIs to new internal header Brendan Jackman
2026-07-16 15:22 ` Vlastimil Babka (SUSE)
2026-07-16 16:04 ` Brendan Jackman
2026-07-16 16:48 ` Matthew Wilcox
2026-07-16 16:57 ` Brendan Jackman
2026-07-16 14:30 ` [PATCH 2/3] mm, treewide: replace __folio_alloc_node() with folio_alloc_node() Brendan Jackman
2026-07-16 17:00 ` Brendan Jackman
2026-07-16 14:30 ` [PATCH 3/3] mm: move __folio_alloc() to page_alloc.h Brendan Jackman
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.