summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hildenbrand (Arm) <david@kernel.org>2026-07-16 16:51:05 +0200
committerAndrew Morton <akpm@linux-foundation.org>2026-08-04 19:18:41 -0700
commitf20e92095f17c4a8be31eb8503e94cfd50c60949 (patch)
tree139d4175ccdc417dbffd6f8c82a410573d3f7e40
parent7bfc04d6bd8d7fc60436cd8914928e8b80696439 (diff)
downloadlinux-f20e92095f17c4a8be31eb8503e94cfd50c60949.tar.gz
linux-f20e92095f17c4a8be31eb8503e94cfd50c60949.zip
x86/mm: stop marking page tables as MIX_SECTION_INFO
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. Link: https://lore.kernel.org/20260716-bootmem_info_part2-v2-6-4afc76c73d61@kernel.org Signed-off-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com> Cc: Alexander Gordeev <agordeev@linux.ibm.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: "Borislav Petkov (AMD)" <bp@alien8.de> Cc: Brendan Jackman <jackmanb@google.com> Cc: Brendan Jackman <brendan.jackman@linux.dev> Cc: Christian Borntraeger <borntraeger@linux.ibm.com> Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com> Cc: Heiko Carstens <hca@linux.ibm.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Liam R. Howlett <liam@infradead.org> Cc: Lorenzo Stoakes <ljs@kernel.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Oscar Salvador <osalvador@suse.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Sven Schnelle <svens@linux.ibm.com> Cc: Vasily Gorbik <gor@linux.ibm.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--arch/x86/mm/init_64.c59
1 files changed, 2 insertions, 57 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 82bb0384b8ab..1b17dcf781e6 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