* [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2)
@ 2026-07-16 14:50 David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
` (10 more replies)
0 siblings, 11 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:50 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
Let's remove the remaining pieces of CONFIG_HAVE_BOOTMEM_INFO_NODE,
performing some smaller cleanups around freeing of reserved vmemmap
pages on the way.
Tested on x86-64 with hugetlb vmemmap optimization in combination with
KMEMLEAK. Heavily cross-compiled.
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
Changes in v2:
- In patch #2, reverse the order of setting the page count and clearing
PG_reserved, and modify the patch description accordingly.
- Link to v1: https://patch.msgid.link/20260708-bootmem_info_part2-v1-0-156ce4986598@kernel.org
---
David Hildenbrand (Arm) (10):
x86/mm: drop order parameter from free_pagetable()
mm: provide free_reserved_pages(), removing x86 variant
s390/mm: use free_reserved_pages() in vmem_free_pages()
mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type
x86/mm: stop marking vmemmap as SECTION_INFO
x86/mm: stop marking page tables as MIX_SECTION_INFO
x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE
mm/hugetlb_vmemmap: remove bootmem_info leftovers
mm/sparse: remove bootmem_info.h include
mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE
MAINTAINERS | 1 -
arch/s390/mm/vmem.c | 4 +-
arch/x86/mm/init_64.c | 134 ++++---------------------------------------
include/linux/bootmem_info.h | 89 ----------------------------
include/linux/mm.h | 8 ++-
mm/Kconfig | 8 ---
mm/Makefile | 1 -
mm/bootmem_info.c | 72 -----------------------
mm/hugetlb_vmemmap.c | 8 +--
mm/page_alloc.c | 33 ++++++++---
mm/sparse.c | 1 -
11 files changed, 46 insertions(+), 313 deletions(-)
---
base-commit: d11ba1f570615ec8d4814d6313ee1d7075a33787
change-id: 20260428-bootmem_info_part2-4bbb445d9b3d
--
Cheers,
David
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable()
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 21:11 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant David Hildenbrand (Arm)
` (9 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
All callers pass 0, so let's drop the parameter.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/x86/mm/init_64.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index d57f29ca23a5a..69e36f02a663a 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1006,22 +1006,19 @@ static void free_reserved_pages(struct page *page, unsigned long nr_pages)
free_reserved_page(page++);
}
-static void __meminit free_pagetable(struct page *page, int order)
+static void __meminit free_pagetable(struct page *page)
{
/* bootmem page has reserved flag */
if (PageReserved(page)) {
- unsigned long nr_pages = 1 << order;
#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
enum bootmem_type type = bootmem_type(page);
- if (type == MIX_SECTION_INFO) {
- while (nr_pages--)
- put_page_bootmem(page++);
- } else {
- free_reserved_pages(page, nr_pages);
- }
+ if (type == MIX_SECTION_INFO)
+ put_page_bootmem(page);
+ else
+ free_reserved_page(page);
#else
- free_reserved_pages(page, nr_pages);
+ free_reserved_page(page);
#endif
} else {
pagetable_free(page_ptdesc(page));
@@ -1060,7 +1057,7 @@ static void __meminit free_pte_table(pte_t *pte_start, pmd_t *pmd)
}
/* free a pte table */
- free_pagetable(pmd_page(*pmd), 0);
+ free_pagetable(pmd_page(*pmd));
spin_lock(&init_mm.page_table_lock);
pmd_clear(pmd);
spin_unlock(&init_mm.page_table_lock);
@@ -1078,7 +1075,7 @@ static void __meminit free_pmd_table(pmd_t *pmd_start, pud_t *pud)
}
/* free a pmd table */
- free_pagetable(pud_page(*pud), 0);
+ free_pagetable(pud_page(*pud));
spin_lock(&init_mm.page_table_lock);
pud_clear(pud);
spin_unlock(&init_mm.page_table_lock);
@@ -1096,7 +1093,7 @@ static void __meminit free_pud_table(pud_t *pud_start, p4d_t *p4d)
}
/* free a pud table */
- free_pagetable(p4d_page(*p4d), 0);
+ free_pagetable(p4d_page(*p4d));
spin_lock(&init_mm.page_table_lock);
p4d_clear(p4d);
spin_unlock(&init_mm.page_table_lock);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 21:13 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages() David Hildenbrand (Arm)
` (8 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
Let's extend free_reserved_page() in page_alloc.c to free_reserved_pages(),
dropping the custom x86 variant. The common-code variant will consume an
order, so adjust the x86 callers accordingly.
Make free_reserved_pages() assume that we are freeing ordinary
high-order pages, just with the special "reserved" flavor. The target
use case for now is freeing vmemmap PMD pages.
Set the refcount directly to 0 (instead of 1) and call
__free_frozen_pages(). Set the page count to 0 before clearing
PG_reserved, so someone checking PG_reserved (and not finding it set)
to then try grabbing a ref would not suddenly have that ref be dropped.
That is arguably cleaner and safer than the old way of doing it.
Add some kerneldoc. Use a single adjust_managed_page_count() call.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/x86/mm/init_64.c | 8 +-------
include/linux/mm.h | 8 ++++++--
mm/page_alloc.c | 33 ++++++++++++++++++++++++++-------
3 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 69e36f02a663a..320e742b0bb3f 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1000,12 +1000,6 @@ int arch_add_memory(int nid, u64 start, u64 size,
return add_pages(nid, start_pfn, nr_pages, params);
}
-static void free_reserved_pages(struct page *page, unsigned long nr_pages)
-{
- while (nr_pages--)
- free_reserved_page(page++);
-}
-
static void __meminit free_pagetable(struct page *page)
{
/* bootmem page has reserved flag */
@@ -1038,7 +1032,7 @@ static void __meminit free_vmemmap_pages(struct page *page, unsigned int order,
while (nr_pages--)
put_page_bootmem(page++);
} else {
- free_reserved_pages(page, nr_pages);
+ free_reserved_pages(page, order);
}
} else {
__free_pages(page, order);
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 113e1752548c2..62b261cccf16f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3993,8 +3993,12 @@ extern unsigned long free_reserved_area(void *start, void *end,
extern void adjust_managed_page_count(struct page *page, long count);
-/* Free the reserved page into the buddy system, so it gets managed. */
-void free_reserved_page(struct page *page);
+void free_reserved_pages(struct page *page, unsigned int order);
+
+static inline void free_reserved_page(struct page *page)
+{
+ free_reserved_pages(page, 0);
+}
static inline void mark_page_reserved(struct page *page)
{
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index a63733dac659e..2e17243ff604f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6381,15 +6381,34 @@ void adjust_managed_page_count(struct page *page, long count)
}
EXPORT_SYMBOL(adjust_managed_page_count);
-void free_reserved_page(struct page *page)
+/**
+ * free_reserved_pages - free reserved pages
+ * @page: First page to free.
+ * @order: The page order to free.
+ *
+ * Free pages allocated through memblock during boot, letting the buddy
+ * manage them from now on.
+ *
+ * @page must be naturally aligned to the order and the order must not
+ * exceed MAX_PAGE_ORDER. All pages must be reserved.
+ */
+void free_reserved_pages(struct page *page, unsigned int order)
{
- clear_page_tag_ref(page);
- ClearPageReserved(page);
- init_page_count(page);
- __free_page(page);
- adjust_managed_page_count(page, 1);
+ const unsigned long nr_pages = 1UL << order;
+ int i;
+
+ VM_WARN_ON_ONCE(!IS_ALIGNED(page_to_pfn(page), nr_pages));
+ VM_WARN_ON_ONCE(order > MAX_PAGE_ORDER);
+
+ for (i = 0; i < nr_pages; i++) {
+ clear_page_tag_ref(page + i);
+ set_page_count(page + i, 0);
+ ClearPageReserved(page + i);
+ }
+ adjust_managed_page_count(page, nr_pages);
+ __free_frozen_pages(page, order, FPI_NONE);
}
-EXPORT_SYMBOL(free_reserved_page);
+EXPORT_SYMBOL(free_reserved_pages);
static int page_alloc_cpu_dead(unsigned int cpu)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages()
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 21:13 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type David Hildenbrand (Arm)
` (7 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
Let's use our new generic helper.
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/s390/mm/vmem.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c
index 94ee06ae89134..d2879ce860a13 100644
--- a/arch/s390/mm/vmem.c
+++ b/arch/s390/mm/vmem.c
@@ -39,7 +39,6 @@ static void __ref *vmem_alloc_pages(unsigned int order)
static void vmem_free_pages(unsigned long addr, int order, struct vmem_altmap *altmap)
{
- unsigned int nr_pages = 1 << order;
struct page *page;
if (altmap) {
@@ -49,8 +48,7 @@ static void vmem_free_pages(unsigned long addr, int order, struct vmem_altmap *a
page = virt_to_page((void *)addr);
if (PageReserved(page)) {
/* allocated from memblock */
- while (nr_pages--)
- free_reserved_page(page++);
+ free_reserved_pages(page, order);
} else {
free_pages(addr, order);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (2 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages() David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 21:14 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 05/10] x86/mm: stop marking vmemmap as SECTION_INFO David Hildenbrand (Arm)
` (6 subsequent siblings)
10 siblings, 1 reply; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
As preparation for further changes, let's temporarily allow freeing
pages that were not previously registered.
This will allow freeing unregistered vmemmap pages allocated during boot
through free_bootmem_page() from hugetlb code, until we fully rip all
of that out.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
include/linux/bootmem_info.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/linux/bootmem_info.h b/include/linux/bootmem_info.h
index f724340755e55..486acc6127039 100644
--- a/include/linux/bootmem_info.h
+++ b/include/linux/bootmem_info.h
@@ -44,12 +44,12 @@ static inline void free_bootmem_page(struct page *page)
{
enum bootmem_type type = bootmem_type(page);
- VM_BUG_ON_PAGE(page_ref_count(page) != 2, page);
-
- if (type == SECTION_INFO || type == MIX_SECTION_INFO)
+ if (type == SECTION_INFO || type == MIX_SECTION_INFO) {
+ VM_WARN_ON_PAGE(page_ref_count(page) != 2, page);
put_page_bootmem(page);
- else
- VM_BUG_ON_PAGE(1, page);
+ } else {
+ free_reserved_page(page);
+ }
}
#else
static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 05/10] x86/mm: stop marking vmemmap as SECTION_INFO
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (3 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 06/10] x86/mm: stop marking page tables as MIX_SECTION_INFO David Hildenbrand (Arm)
` (5 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
We added the whole bootmem registration machinery in commit 04753278769f
("memory hotplug: register section/node id to free").
The main use case was to remember to which memory section memmap pages
belonged, so the memmap could be handled accordingly when freeing
memory.
However, all that machinery is not required anymore: a memory section
can only get offlined if *all* pages can get offlined; and it can only
get unplugged once offline. If some of these pages are unmovable memmap
pages: bad luck, doesn't work. Offlining will fail.
Further, a lot of this machinery was required for pre-vmemmap support.
Now we only support the vmemmap with memory hotplug.
So the whole machinery is useless today. Let's start by removing the
last pieces by first stopping to mark vmemmap pages as SECTION_INFO.
In free_vmemmap_pages(), we can now always just free the reserved pages
directly.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/x86/mm/init_64.c | 30 ++++--------------------------
1 file changed, 4 insertions(+), 26 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 320e742b0bb3f..82bb0384b8ab0 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1024,19 +1024,12 @@ static void __meminit free_vmemmap_pages(struct page *page, unsigned int order,
{
unsigned long nr_pages = 1u << order;
- if (altmap) {
+ if (altmap)
vmem_altmap_free(altmap, nr_pages);
- } else if (PageReserved(page)) {
- if (IS_ENABLED(CONFIG_HAVE_BOOTMEM_INFO_NODE) &&
- bootmem_type(page) == SECTION_INFO) {
- while (nr_pages--)
- put_page_bootmem(page++);
- } else {
- free_reserved_pages(page, order);
- }
- } else {
+ else if (PageReserved(page))
+ free_reserved_pages(page, order);
+ else
__free_pages(page, order);
- }
}
static void __meminit free_pte_table(pte_t *pte_start, pmd_t *pmd)
@@ -1593,12 +1586,8 @@ void register_page_bootmem_memmap(unsigned long section_nr,
p4d_t *p4d;
pud_t *pud;
pmd_t *pmd;
- unsigned int nr_pmd_pages;
- struct page *page;
for (; addr < end; addr = next) {
- pte_t *pte = NULL;
-
pgd = pgd_offset_k(addr);
if (pgd_none(*pgd)) {
next = (addr + PAGE_SIZE) & PAGE_MASK;
@@ -1630,19 +1619,8 @@ void register_page_bootmem_memmap(unsigned long section_nr,
next = (addr + PAGE_SIZE) & PAGE_MASK;
get_page_bootmem(section_nr, pmd_page(*pmd),
MIX_SECTION_INFO);
-
- pte = pte_offset_kernel(pmd, addr);
- if (pte_none(*pte))
- continue;
- get_page_bootmem(section_nr, pte_page(*pte),
- SECTION_INFO);
} else {
next = pmd_addr_end(addr, end);
- nr_pmd_pages = (next - addr) >> PAGE_SHIFT;
- page = pmd_page(*pmd);
- while (nr_pmd_pages--)
- get_page_bootmem(section_nr, page++,
- SECTION_INFO);
}
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 06/10] x86/mm: stop marking page tables as MIX_SECTION_INFO
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (4 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 05/10] x86/mm: stop marking vmemmap as SECTION_INFO David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 07/10] x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
` (4 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
There is no good reason to mark boot page tables as MIX_SECTION_INFO: we
only free boot page tables when they are completely empty, and memory
offlining/hotunplug doesn't benefit from it in any way.
So just stop marking page tables as MIX_SECTION_INFO. In
free_pagetable(), we can now simply free reserved pages directly.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/x86/mm/init_64.c | 59 ++-------------------------------------------------
1 file changed, 2 insertions(+), 57 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 82bb0384b8ab0..1b17dcf781e66 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1002,21 +1002,10 @@ int arch_add_memory(int nid, u64 start, u64 size,
static void __meminit free_pagetable(struct page *page)
{
- /* bootmem page has reserved flag */
- if (PageReserved(page)) {
-#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
- enum bootmem_type type = bootmem_type(page);
-
- if (type == MIX_SECTION_INFO)
- put_page_bootmem(page);
- else
- free_reserved_page(page);
-#else
+ if (PageReserved(page))
free_reserved_page(page);
-#endif
- } else {
+ else
pagetable_free(page_ptdesc(page));
- }
}
static void __meminit free_vmemmap_pages(struct page *page, unsigned int order,
@@ -1579,50 +1568,6 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
void register_page_bootmem_memmap(unsigned long section_nr,
struct page *start_page, unsigned long nr_pages)
{
- unsigned long addr = (unsigned long)start_page;
- unsigned long end = (unsigned long)(start_page + nr_pages);
- unsigned long next;
- pgd_t *pgd;
- p4d_t *p4d;
- pud_t *pud;
- pmd_t *pmd;
-
- for (; addr < end; addr = next) {
- pgd = pgd_offset_k(addr);
- if (pgd_none(*pgd)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
- get_page_bootmem(section_nr, pgd_page(*pgd), MIX_SECTION_INFO);
-
- p4d = p4d_offset(pgd, addr);
- if (p4d_none(*p4d)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
- get_page_bootmem(section_nr, p4d_page(*p4d), MIX_SECTION_INFO);
-
- pud = pud_offset(p4d, addr);
- if (pud_none(*pud)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
- get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
-
- pmd = pmd_offset(pud, addr);
- if (pmd_none(*pmd)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- continue;
- }
-
- if (!boot_cpu_has(X86_FEATURE_PSE) || !pmd_leaf(*pmd)) {
- next = (addr + PAGE_SIZE) & PAGE_MASK;
- get_page_bootmem(section_nr, pmd_page(*pmd),
- MIX_SECTION_INFO);
- } else {
- next = pmd_addr_end(addr, end);
- }
- }
}
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 07/10] x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (5 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 06/10] x86/mm: stop marking page tables as MIX_SECTION_INFO David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 08/10] mm/hugetlb_vmemmap: remove bootmem_info leftovers David Hildenbrand (Arm)
` (3 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
CONFIG_HAVE_BOOTMEM_INFO_NODE now essentially doesn't do anything.
So let's remove support for CONFIG_HAVE_BOOTMEM_INFO_NODE.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
arch/x86/mm/init_64.c | 26 --------------------------
mm/Kconfig | 1 -
2 files changed, 27 deletions(-)
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 1b17dcf781e66..ab4c5a02326f7 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -33,7 +33,6 @@
#include <linux/nmi.h>
#include <linux/gfp.h>
#include <linux/kcore.h>
-#include <linux/bootmem_info.h>
#include <asm/processor.h>
#include <asm/bios_ebda.h>
@@ -1286,16 +1285,6 @@ void __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap,
static struct kcore_list kcore_vsyscall;
-static void __init register_page_bootmem_info(void)
-{
-#if defined(CONFIG_NUMA) || defined(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP)
- int i;
-
- for_each_online_node(i)
- register_page_bootmem_info_node(NODE_DATA(i));
-#endif
-}
-
/*
* Pre-allocates page-table pages for the vmalloc area in the kernel page-table.
* Only the level which needs to be synchronized between all page-tables is
@@ -1358,14 +1347,6 @@ void __init mem_init(void)
after_bootmem = 1;
x86_init.hyper.init_after_bootmem();
- /*
- * Must be done after boot memory is put on freelist, because here we
- * might set fields in deferred struct pages that have not yet been
- * initialized, and memblock_free_all() initializes all the reserved
- * deferred pages for us.
- */
- register_page_bootmem_info();
-
/* Register memory areas for /proc/kcore */
if (get_gate_vma(&init_mm))
kclist_add(&kcore_vsyscall, (void *)VSYSCALL_ADDR, PAGE_SIZE, KCORE_USER);
@@ -1564,13 +1545,6 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
return err;
}
-#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
-void register_page_bootmem_memmap(unsigned long section_nr,
- struct page *start_page, unsigned long nr_pages)
-{
-}
-#endif
-
void __meminit vmemmap_populate_print_last(void)
{
if (p_start) {
diff --git a/mm/Kconfig b/mm/Kconfig
index f794a341d7422..592003a258bad 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -590,7 +590,6 @@ endchoice
config MEMORY_HOTREMOVE
bool "Allow for memory hot remove"
- select HAVE_BOOTMEM_INFO_NODE if X86_64
depends on MEMORY_HOTPLUG
select MIGRATION
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 08/10] mm/hugetlb_vmemmap: remove bootmem_info leftovers
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (6 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 07/10] x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 09/10] mm/sparse: remove bootmem_info.h include David Hildenbrand (Arm)
` (2 subsequent siblings)
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
We never set CONFIG_HAVE_BOOTMEM_INFO_NODE, so we can just switch to
free_reserved_page() and drop the register_page_bootmem_memmap() call.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
mm/hugetlb_vmemmap.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
index 1430a5aa2de57..917db0984143c 100644
--- a/mm/hugetlb_vmemmap.c
+++ b/mm/hugetlb_vmemmap.c
@@ -12,7 +12,6 @@
#include <linux/pgtable.h>
#include <linux/moduleparam.h>
-#include <linux/bootmem_info.h>
#include <linux/mmdebug.h>
#include <linux/pagewalk.h>
#include <linux/pgalloc.h>
@@ -177,13 +176,13 @@ static int vmemmap_remap_range(unsigned long start, unsigned long end,
* Free a vmemmap page. A vmemmap page can be allocated from the memblock
* allocator or buddy allocator. If the PG_reserved flag is set, it means
* that it allocated from the memblock allocator, just free it via the
- * free_bootmem_page(). Otherwise, use __free_page().
+ * free_reserved_page(). Otherwise, use __free_page().
*/
static inline void free_vmemmap_page(struct page *page)
{
if (PageReserved(page)) {
memmap_boot_pages_add(-1);
- free_bootmem_page(page);
+ free_reserved_page(page);
} else {
memmap_pages_add(-1);
__free_page(page);
@@ -641,9 +640,6 @@ static void __hugetlb_vmemmap_optimize_folios(struct hstate *h,
epfn = spfn + hugetlb_vmemmap_size(h);
vmemmap_wrprotect_hvo(spfn, epfn, folio_nid(folio),
HUGETLB_VMEMMAP_RESERVE_SIZE);
- register_page_bootmem_memmap(pfn_to_section_nr(folio_pfn(folio)),
- &folio->page,
- HUGETLB_VMEMMAP_RESERVE_PAGES);
continue;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 09/10] mm/sparse: remove bootmem_info.h include
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (7 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 08/10] mm/hugetlb_vmemmap: remove bootmem_info leftovers David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 10/10] mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
2026-07-16 16:19 ` [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) Dave Hansen
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
No longer required, so let's remove it.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
mm/sparse.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/mm/sparse.c b/mm/sparse.c
index 058ef93003672..b5c74aab3379a 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -13,7 +13,6 @@
#include <linux/vmalloc.h>
#include <linux/swap.h>
#include <linux/swapops.h>
-#include <linux/bootmem_info.h>
#include <linux/vmstat.h>
#include "internal.h"
#include <asm/dma.h>
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 10/10] mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (8 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 09/10] mm/sparse: remove bootmem_info.h include David Hildenbrand (Arm)
@ 2026-07-16 14:51 ` David Hildenbrand (Arm)
2026-07-16 16:19 ` [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) Dave Hansen
10 siblings, 0 replies; 16+ messages in thread
From: David Hildenbrand (Arm) @ 2026-07-16 14:51 UTC (permalink / raw)
To: Dave Hansen, Andy Lutomirski, Peter Zijlstra, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin, Andrew Morton,
Lorenzo Stoakes, Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390, David Hildenbrand (Arm)
The whole infrastructure is unused now. Let's remove the config option
along with mm/bootmem_info. + include/linux/bootmem_info.h.
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
---
MAINTAINERS | 1 -
include/linux/bootmem_info.h | 89 --------------------------------------------
mm/Kconfig | 7 ----
mm/Makefile | 1 -
mm/bootmem_info.c | 72 -----------------------------------
5 files changed, 170 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index d19822d574fd4..9a67ae0f7865e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -16877,7 +16877,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rppt/memblock.git fixes
F: Documentation/core-api/boot-time-mm.rst
F: include/linux/kho/abi/memblock.h
F: include/linux/memblock.h
-F: mm/bootmem_info.c
F: mm/memblock.c
F: mm/memtest.c
F: mm/mm_init.c
diff --git a/include/linux/bootmem_info.h b/include/linux/bootmem_info.h
deleted file mode 100644
index 486acc6127039..0000000000000
--- a/include/linux/bootmem_info.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __LINUX_BOOTMEM_INFO_H
-#define __LINUX_BOOTMEM_INFO_H
-
-#include <linux/mm.h>
-#include <linux/kmemleak.h>
-
-/*
- * Types for free bootmem stored in the low bits of page->private.
- */
-enum bootmem_type {
- MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE = 1,
- SECTION_INFO = MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE,
- MIX_SECTION_INFO,
- NODE_INFO,
- MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE = NODE_INFO,
-};
-
-#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
-void __init register_page_bootmem_info_node(struct pglist_data *pgdat);
-void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
- unsigned long nr_pages);
-
-void get_page_bootmem(unsigned long info, struct page *page,
- enum bootmem_type type);
-void put_page_bootmem(struct page *page);
-
-static inline enum bootmem_type bootmem_type(const struct page *page)
-{
- return (unsigned long)page->private & 0xf;
-}
-
-static inline unsigned long bootmem_info(const struct page *page)
-{
- return (unsigned long)page->private >> 4;
-}
-
-/*
- * Any memory allocated via the memblock allocator and not via the
- * buddy will be marked reserved already in the memmap. For those
- * pages, we can call this function to free it to buddy allocator.
- */
-static inline void free_bootmem_page(struct page *page)
-{
- enum bootmem_type type = bootmem_type(page);
-
- if (type == SECTION_INFO || type == MIX_SECTION_INFO) {
- VM_WARN_ON_PAGE(page_ref_count(page) != 2, page);
- put_page_bootmem(page);
- } else {
- free_reserved_page(page);
- }
-}
-#else
-static inline void register_page_bootmem_info_node(struct pglist_data *pgdat)
-{
-}
-
-static inline void register_page_bootmem_memmap(unsigned long section_nr,
- struct page *map, unsigned long nr_pages)
-{
-}
-
-static inline void put_page_bootmem(struct page *page)
-{
-}
-
-static inline enum bootmem_type bootmem_type(const struct page *page)
-{
- return SECTION_INFO;
-}
-
-static inline unsigned long bootmem_info(const struct page *page)
-{
- return 0;
-}
-
-static inline void get_page_bootmem(unsigned long info, struct page *page,
- enum bootmem_type type)
-{
-}
-
-static inline void free_bootmem_page(struct page *page)
-{
- free_reserved_page(page);
-}
-#endif
-
-#endif /* __LINUX_BOOTMEM_INFO_H */
diff --git a/mm/Kconfig b/mm/Kconfig
index 592003a258bad..169a3ba12a255 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -509,13 +509,6 @@ config EXCLUSIVE_SYSTEM_RAM
def_bool y
depends on !DEVMEM || STRICT_DEVMEM
-#
-# Only be set on architectures that have completely implemented memory hotplug
-# feature. If you are not sure, don't touch it.
-#
-config HAVE_BOOTMEM_INFO_NODE
- def_bool n
-
config ARCH_ENABLE_MEMORY_HOTPLUG
bool
diff --git a/mm/Makefile b/mm/Makefile
index 4fc713867b9bd..52428a3d3ae14 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -141,7 +141,6 @@ obj-$(CONFIG_MEMFD_CREATE) += memfd.o
obj-$(CONFIG_MAPPING_DIRTY_HELPERS) += mapping_dirty_helpers.o
obj-$(CONFIG_PTDUMP) += ptdump.o
obj-$(CONFIG_PAGE_REPORTING) += page_reporting.o
-obj-$(CONFIG_HAVE_BOOTMEM_INFO_NODE) += bootmem_info.o
obj-$(CONFIG_GENERIC_IOREMAP) += ioremap.o
obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o
obj-$(CONFIG_EXECMEM) += execmem.o
diff --git a/mm/bootmem_info.c b/mm/bootmem_info.c
deleted file mode 100644
index 0fa78db7fbc0b..0000000000000
--- a/mm/bootmem_info.c
+++ /dev/null
@@ -1,72 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Bootmem core functions.
- *
- * Copyright (c) 2020, Bytedance.
- *
- * Author: Muchun Song <songmuchun@bytedance.com>
- *
- */
-#include <linux/mm.h>
-#include <linux/compiler.h>
-#include <linux/memblock.h>
-#include <linux/bootmem_info.h>
-#include <linux/memory_hotplug.h>
-#include <linux/kmemleak.h>
-
-void get_page_bootmem(unsigned long info, struct page *page,
- enum bootmem_type type)
-{
- BUG_ON(type > 0xf);
- BUG_ON(info > (ULONG_MAX >> 4));
- set_page_private(page, info << 4 | type);
- page_ref_inc(page);
-}
-
-void put_page_bootmem(struct page *page)
-{
- enum bootmem_type type = bootmem_type(page);
-
- BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE ||
- type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE);
-
- if (page_ref_dec_return(page) == 1) {
- set_page_private(page, 0);
- free_reserved_page(page);
- }
-}
-
-static void __init register_page_bootmem_info_section(unsigned long start_pfn)
-{
- unsigned long section_nr;
- struct mem_section *ms;
-
- start_pfn = SECTION_ALIGN_DOWN(start_pfn);
- section_nr = pfn_to_section_nr(start_pfn);
- ms = __nr_to_section(section_nr);
-
- if (!preinited_vmemmap_section(ms))
- register_page_bootmem_memmap(section_nr, pfn_to_page(start_pfn),
- PAGES_PER_SECTION);
-}
-
-void __init register_page_bootmem_info_node(struct pglist_data *pgdat)
-{
- unsigned long pfn, end_pfn;
- int node = pgdat->node_id;
-
- pfn = pgdat->node_start_pfn;
- end_pfn = pgdat_end_pfn(pgdat);
-
- /* register section info */
- for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
- /*
- * Some platforms can assign the same pfn to multiple nodes - on
- * node0 as well as nodeN. To avoid registering a pfn against
- * multiple nodes we check that this pfn does not already
- * reside in some other nodes.
- */
- if (pfn_valid(pfn) && (early_pfn_to_nid(pfn) == node))
- register_page_bootmem_info_section(pfn);
- }
-}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2)
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
` (9 preceding siblings ...)
2026-07-16 14:51 ` [PATCH v2 10/10] mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
@ 2026-07-16 16:19 ` Dave Hansen
10 siblings, 0 replies; 16+ messages in thread
From: Dave Hansen @ 2026-07-16 16:19 UTC (permalink / raw)
To: David Hildenbrand (Arm), Dave Hansen, Andy Lutomirski,
Peter Zijlstra, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
x86, H. Peter Anvin, Andrew Morton, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Zi Yan, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390
On 7/16/26 07:50, David Hildenbrand (Arm) wrote:
> arch/x86/mm/init_64.c | 134 ++++---------------------------------------
Uhhh. Wow. <blink><blink><blink>
This is a really big win. Thanks for doing this!
I assume the plan is to take this series through the mm route?
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable()
2026-07-16 14:51 ` [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
@ 2026-07-16 21:11 ` Zi Yan
0 siblings, 0 replies; 16+ messages in thread
From: Zi Yan @ 2026-07-16 21:11 UTC (permalink / raw)
To: David Hildenbrand (Arm), Dave Hansen, Andy Lutomirski,
Peter Zijlstra, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
x86, H. Peter Anvin, Andrew Morton, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390
On Thu Jul 16, 2026 at 10:51 AM EDT, David Hildenbrand (Arm) wrote:
> All callers pass 0, so let's drop the parameter.
>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Reviewed-by: Muchun Song <muchun.song@linux.dev>
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
> arch/x86/mm/init_64.c | 21 +++++++++------------
> 1 file changed, 9 insertions(+), 12 deletions(-)
>
LGTM.
Reviewed-by: Zi Yan <ziy@nvidia.com>
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant
2026-07-16 14:51 ` [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant David Hildenbrand (Arm)
@ 2026-07-16 21:13 ` Zi Yan
0 siblings, 0 replies; 16+ messages in thread
From: Zi Yan @ 2026-07-16 21:13 UTC (permalink / raw)
To: David Hildenbrand (Arm), Dave Hansen, Andy Lutomirski,
Peter Zijlstra, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
x86, H. Peter Anvin, Andrew Morton, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390
On Thu Jul 16, 2026 at 10:51 AM EDT, David Hildenbrand (Arm) wrote:
> Let's extend free_reserved_page() in page_alloc.c to free_reserved_pages(),
> dropping the custom x86 variant. The common-code variant will consume an
> order, so adjust the x86 callers accordingly.
>
> Make free_reserved_pages() assume that we are freeing ordinary
> high-order pages, just with the special "reserved" flavor. The target
> use case for now is freeing vmemmap PMD pages.
>
> Set the refcount directly to 0 (instead of 1) and call
> __free_frozen_pages(). Set the page count to 0 before clearing
> PG_reserved, so someone checking PG_reserved (and not finding it set)
> to then try grabbing a ref would not suddenly have that ref be dropped.
> That is arguably cleaner and safer than the old way of doing it.
>
> Add some kerneldoc. Use a single adjust_managed_page_count() call.
>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Reviewed-by: Muchun Song <muchun.song@linux.dev>
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
> arch/x86/mm/init_64.c | 8 +-------
> include/linux/mm.h | 8 ++++++--
> mm/page_alloc.c | 33 ++++++++++++++++++++++++++-------
> 3 files changed, 33 insertions(+), 16 deletions(-)
>
LGTM.
Reviewed-by: Zi Yan <ziy@nvidia.com>
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages()
2026-07-16 14:51 ` [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages() David Hildenbrand (Arm)
@ 2026-07-16 21:13 ` Zi Yan
0 siblings, 0 replies; 16+ messages in thread
From: Zi Yan @ 2026-07-16 21:13 UTC (permalink / raw)
To: David Hildenbrand (Arm), Dave Hansen, Andy Lutomirski,
Peter Zijlstra, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
x86, H. Peter Anvin, Andrew Morton, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390
On Thu Jul 16, 2026 at 10:51 AM EDT, David Hildenbrand (Arm) wrote:
> Let's use our new generic helper.
>
> Acked-by: Heiko Carstens <hca@linux.ibm.com>
> Reviewed-by: Muchun Song <muchun.song@linux.dev>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
> arch/s390/mm/vmem.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
Reviewed-by: Zi Yan <ziy@nvidia.com>
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type
2026-07-16 14:51 ` [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type David Hildenbrand (Arm)
@ 2026-07-16 21:14 ` Zi Yan
0 siblings, 0 replies; 16+ messages in thread
From: Zi Yan @ 2026-07-16 21:14 UTC (permalink / raw)
To: David Hildenbrand (Arm), Dave Hansen, Andy Lutomirski,
Peter Zijlstra, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
x86, H. Peter Anvin, Andrew Morton, Lorenzo Stoakes,
Liam R. Howlett, Vlastimil Babka, Mike Rapoport,
Suren Baghdasaryan, Michal Hocko, Brendan Jackman,
Johannes Weiner, Alexander Gordeev, Gerald Schaefer,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger,
Sven Schnelle, Muchun Song, Oscar Salvador
Cc: linux-kernel, linux-mm, linux-s390
On Thu Jul 16, 2026 at 10:51 AM EDT, David Hildenbrand (Arm) wrote:
> As preparation for further changes, let's temporarily allow freeing
> pages that were not previously registered.
>
> This will allow freeing unregistered vmemmap pages allocated during boot
> through free_bootmem_page() from hugetlb code, until we fully rip all
> of that out.
>
> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Reviewed-by: Muchun Song <muchun.song@linux.dev>
> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
> ---
> include/linux/bootmem_info.h | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
Acked-by: Zi Yan <ziy@nvidia.com>
--
Best Regards,
Yan, Zi
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-07-16 21:14 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-16 14:50 [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 01/10] x86/mm: drop order parameter from free_pagetable() David Hildenbrand (Arm)
2026-07-16 21:11 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 02/10] mm: provide free_reserved_pages(), removing x86 variant David Hildenbrand (Arm)
2026-07-16 21:13 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 03/10] s390/mm: use free_reserved_pages() in vmem_free_pages() David Hildenbrand (Arm)
2026-07-16 21:13 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 04/10] mm/bootmem_info: allow calling free_bootmem_page() on pages without a bootmem_type David Hildenbrand (Arm)
2026-07-16 21:14 ` Zi Yan
2026-07-16 14:51 ` [PATCH v2 05/10] x86/mm: stop marking vmemmap as SECTION_INFO David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 06/10] x86/mm: stop marking page tables as MIX_SECTION_INFO David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 07/10] x86/mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 08/10] mm/hugetlb_vmemmap: remove bootmem_info leftovers David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 09/10] mm/sparse: remove bootmem_info.h include David Hildenbrand (Arm)
2026-07-16 14:51 ` [PATCH v2 10/10] mm/bootmem_info: remove CONFIG_HAVE_BOOTMEM_INFO_NODE David Hildenbrand (Arm)
2026-07-16 16:19 ` [PATCH v2 00/10] mm: remove CONFIG_HAVE_BOOTMEM_INFO_NODE (Part 2) Dave Hansen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox