]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
arch, mm: consolidate initialization of nodes, zones and memory map
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Sun, 11 Jan 2026 08:20:57 +0000 (10:20 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 27 Jan 2026 04:02:18 +0000 (20:02 -0800)
To initialize node, zone and memory map data structures every architecture
calls free_area_init() during setup_arch() and passes it an array of zone
limits.

Beside code duplication it creates "interesting" ordering cases between
allocation and initialization of hugetlb and the memory map.  Some
architectures allocate hugetlb pages very early in setup_arch() in certain
cases, some only create hugetlb CMA areas in setup_arch() and sometimes
hugetlb allocations happen mm_core_init().

With arch_zone_limits_init() helper available now on all architectures it
is no longer necessary to call free_area_init() from architecture setup
code.  Rather core MM initialization can call arch_zone_limits_init() in a
single place.

This allows to unify ordering of hugetlb vs memory map allocation and
initialization.

Remove the call to free_area_init() from architecture specific code and
place it in a new mm_core_init_early() function that is called immediately
after setup_arch().

After this refactoring it is possible to consolidate hugetlb allocations
and eliminate differences in ordering of hugetlb and memory map
initialization among different architectures.

As the first step of this consolidation move hugetlb_bootmem_alloc() to
mm_core_early_init().

Link: https://lkml.kernel.org/r/20260111082105.290734-24-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alex Shi <alexs@kernel.org>
Cc: Andreas Larsson <andreas@gaisler.com>
Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: Dinh Nguyen <dinguyen@kernel.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Guo Ren <guoren@kernel.org>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Helge Deller <deller@gmx.de>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Klara Modin <klarasmodin@gmail.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Magnus Lindholm <linmag7@gmail.com>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Pratyush Yadav <pratyush@kernel.org>
Cc: Richard Weinberger <richard@nod.at>
Cc: "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Stafford Horne <shorne@gmail.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vineet Gupta <vgupta@kernel.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
35 files changed:
arch/alpha/mm/init.c
arch/arc/mm/init.c
arch/arm/mm/init.c
arch/arm64/mm/init.c
arch/csky/kernel/setup.c
arch/hexagon/mm/init.c
arch/loongarch/include/asm/pgtable.h
arch/loongarch/kernel/setup.c
arch/loongarch/mm/init.c
arch/m68k/mm/init.c
arch/m68k/mm/mcfmmu.c
arch/m68k/mm/motorola.c
arch/m68k/mm/sun3mmu.c
arch/microblaze/mm/init.c
arch/mips/loongson64/numa.c
arch/mips/mm/init.c
arch/mips/sgi-ip27/ip27-memory.c
arch/nios2/mm/init.c
arch/openrisc/mm/init.c
arch/parisc/mm/init.c
arch/powerpc/mm/mem.c
arch/riscv/mm/init.c
arch/s390/mm/init.c
arch/sh/mm/init.c
arch/sparc/mm/init_64.c
arch/sparc/mm/srmmu.c
arch/um/kernel/mem.c
arch/x86/mm/init.c
arch/x86/mm/init_32.c
arch/x86/mm/init_64.c
arch/x86/mm/mm_internal.h
arch/xtensa/mm/init.c
include/linux/mm.h
init/main.c
mm/mm_init.c

index cd0cb1abde5f58f66b2a348e005a729f43de8e96..9531cbc761c06e2d5c1557773809c7eb1a0fad5e 100644 (file)
@@ -220,17 +220,10 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfn)
 }
 
 /*
- * paging_init() sets up the memory map.
+ * paging_init() initializes the kernel's ZERO_PGE.
  */
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = {0, };
-
-       /* Initialize mem_map[].  */
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
-
-       /* Initialize the kernel's ZERO_PGE. */
        memset(absolute_pointer(ZERO_PGE), 0, PAGE_SIZE);
 }
 
index ff7974d380119163d5aeebcea08914abbbeba62a..a5e92f46e5d1370ff89d05052e438034b4e3c30d 100644 (file)
@@ -102,8 +102,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfn)
  */
 void __init setup_arch_memory(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
        setup_initial_init_mm(_text, _etext, _edata, _end);
 
        /* first page of system - kernel .vector starts here */
@@ -158,9 +156,6 @@ void __init setup_arch_memory(void)
        arch_pfn_offset = min(min_low_pfn, min_high_pfn);
        kmap_init();
 #endif /* CONFIG_HIGHMEM */
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
 
 void __init arch_mm_preinit(void)
index bdcc3639681f85b2b0cfa3931baf0fa04a0d2982..a8f7b40847150acb3a8c89c4e4abf522b8497dca 100644 (file)
@@ -118,15 +118,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfn)
 #endif
 }
 
-static void __init zone_sizes_init(unsigned long min, unsigned long max_low,
-       unsigned long max_high)
-{
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
-}
-
 #ifdef CONFIG_HAVE_ARCH_PFN_VALID
 int pfn_valid(unsigned long pfn)
 {
@@ -222,13 +213,6 @@ void __init bootmem_init(void)
         * done after the fixed reservations
         */
        sparse_init();
-
-       /*
-        * Now free the memory - free_area_init needs
-        * the sparse mem_map arrays initialized by sparse_init()
-        * for memmap_init_zone(), otherwise all PFNs are invalid.
-        */
-       zone_sizes_init(min_low_pfn, max_low_pfn, max_pfn);
 }
 
 /*
index 06815d34cc11975da1bc5cbeb2f84de1bc750d43..3641e88ea871e95490a61442ed886791978aeab8 100644 (file)
@@ -134,7 +134,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 static void __init dma_limits_init(void)
 {
-       unsigned long max_zone_pfns[MAX_NR_ZONES]  = {0};
        phys_addr_t __maybe_unused acpi_zone_dma_limit;
        phys_addr_t __maybe_unused dt_zone_dma_limit;
        phys_addr_t __maybe_unused dma32_phys_limit =
@@ -160,9 +159,6 @@ static void __init dma_limits_init(void)
 #endif
        if (!arm64_dma_phys_limit)
                arm64_dma_phys_limit = PHYS_MASK + 1;
-
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
 }
 
 int pfn_is_map_memory(unsigned long pfn)
index 8968815d93e69c94cc794ee23a671b96e426380c..4bf3c01ead3a2c923a249b4fea6757abbcd8c758 100644 (file)
@@ -63,7 +63,6 @@ static void __init csky_memblock_init(void)
 {
        unsigned long lowmem_size = PFN_DOWN(LOWMEM_LIMIT - PHYS_OFFSET_OFFSET);
        unsigned long sseg_size = PFN_DOWN(SSEG_SIZE - PHYS_OFFSET_OFFSET);
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
        signed long size;
 
        memblock_reserve(__pa(_start), _end - _start);
@@ -101,9 +100,6 @@ static void __init csky_memblock_init(void)
        memblock_set_current_limit(PFN_PHYS(max_low_pfn));
 
        dma_contiguous_reserve(0);
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
 
 void __init setup_arch(char **cmdline_p)
index e2c9487d8d347dd1c0e0b9137f0452e7ce23d243..07086dbd33fda3f46fc1fd6e699deb439056ca7e 100644 (file)
@@ -66,20 +66,8 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 }
 
-/*
- * In order to set up page allocator "nodes",
- * somebody has to call free_area_init() for UMA.
- *
- * In this mode, we only have one pg_data_t
- * structure: contig_mem_data.
- */
 static void __init paging_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = {0, };
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);  /*  sets up the zonelists and mem_map  */
-
        /*
         * Set the init_mm descriptors "context" value to point to the
         * initial kernel segment table's physical address.
index f41a648a3d9e212013a5431234451c3c062b3e4e..c33b3bcb733e3adf681054b17c96b2da929a73ab 100644 (file)
@@ -353,8 +353,6 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte)
        return pte;
 }
 
-extern void paging_init(void);
-
 #define pte_none(pte)          (!(pte_val(pte) & ~_PAGE_GLOBAL))
 #define pte_present(pte)       (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE))
 #define pte_no_exec(pte)       (pte_val(pte) & _PAGE_NO_EXEC)
index 20cb6f30645683d322006208bdd093e82095a9f8..708ac025db71de4ca2ec0c1db97ed31229deef30 100644 (file)
@@ -621,8 +621,6 @@ void __init setup_arch(char **cmdline_p)
        prefill_possible_map();
 #endif
 
-       paging_init();
-
 #ifdef CONFIG_KASAN
        kasan_init();
 #endif
index 17235f87eafbcf0b8e92e0d25eba8c22d568a7be..c331bf69d2ec19ead69f82a6a1fca618355e2d91 100644 (file)
@@ -68,14 +68,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 }
 
-void __init paging_init(void)
-{
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
-
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
-}
-
 void __ref free_initmem(void)
 {
        free_initmem_default(POISON_FREE_INITMEM);
index 6b1d9d2434b5067128541f879a217408bd17a4a6..53b71f786c27e7a005082d0dbff7b8e344d280ab 100644 (file)
@@ -69,13 +69,10 @@ void __init paging_init(void)
         * page_alloc get different views of the world.
         */
        unsigned long end_mem = memory_end & PAGE_MASK;
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
 
        high_memory = (void *) end_mem;
 
        empty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
 
 #endif /* CONFIG_MMU */
index 24a6f7bbd1cebb732b3cb5a1be2d7d11981d0fd8..3418fd8642377ffbaeeb1e35d3e3c7a0ec6e6a13 100644 (file)
@@ -39,7 +39,6 @@ void __init paging_init(void)
        pte_t *pg_table;
        unsigned long address, size;
        unsigned long next_pgtable;
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
        int i;
 
        empty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);
@@ -73,8 +72,6 @@ void __init paging_init(void)
        }
 
        current->mm = NULL;
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
 
 int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)
index d6ccd23caf617445589d86d60cf58c2ad4335f47..127a3fa69f4c1b17fd7b1e9381b4f861068355db 100644 (file)
@@ -429,7 +429,6 @@ DECLARE_VM_GET_PAGE_PROT
  */
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
        unsigned long min_addr, max_addr;
        unsigned long addr;
        int i;
@@ -511,12 +510,9 @@ void __init paging_init(void)
        set_fc(USER_DATA);
 
 #ifdef DEBUG
-       printk ("before free_area_init\n");
+       printk ("before node_set_state\n");
 #endif
        for (i = 0; i < m68k_num_memory; i++)
                if (node_present_pages(i))
                        node_set_state(i, N_NORMAL_MEMORY);
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
index fdd69cc4240c66b258b8066cfe54a8948c7f9bd3..c801677f7df87a2692a3f989d813efee48b3c7a9 100644 (file)
@@ -41,7 +41,6 @@ void __init paging_init(void)
        unsigned long address;
        unsigned long next_pgtable;
        unsigned long bootmem_end;
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
        unsigned long size;
 
        empty_zero_page = memblock_alloc_or_panic(PAGE_SIZE, PAGE_SIZE);
@@ -80,14 +79,6 @@ void __init paging_init(void)
        mmu_emu_init(bootmem_end);
 
        current->mm = NULL;
-
-       /* memory sizing is a hack stolen from motorola.c..  hope it works for us */
-       arch_zone_limits_init(max_zone_pfn);
-
-       /* I really wish I knew why the following change made things better...  -- Sam */
-       free_area_init(max_zone_pfn);
-
-
 }
 
 static const pgprot_t protection_map[16] = {
index 54da60b81094988e0ec843d809bad96e25741a88..848cdee1380cab71077749d71fb96adb18f21ef0 100644 (file)
@@ -69,22 +69,15 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
  */
 static void __init paging_init(void)
 {
-       unsigned long zones_size[MAX_NR_ZONES];
        int idx;
 
        /* Setup fixmaps */
        for (idx = 0; idx < __end_of_fixed_addresses; idx++)
                clear_fixmap(idx);
 
-       /* Clean every zones */
-       memset(zones_size, 0, sizeof(zones_size));
-
 #ifdef CONFIG_HIGHMEM
        highmem_init();
 #endif
-       arch_zone_limits_init(zones_size);
-       /* We don't have holes in memory map */
-       free_area_init(zones_size);
 }
 
 void __init setup_memory(void)
index f72a58f87878c4aef130a8a1efa0f89c416f8c7c..2cd95020df08e5d51ef9d316cd00244806851075 100644 (file)
@@ -162,11 +162,7 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init paging_init(void)
 {
-       unsigned long zones_size[MAX_NR_ZONES] = {0, };
-
        pagetable_init();
-       arch_zone_limits_init(zones_size);
-       free_area_init(zones_size);
 }
 
 /* All PCI device belongs to logical Node-0 */
index 269bf6335ac4e60981d1fa444b8f19d4fb141248..2575cba856d352e704197f994b275f472920b6d5 100644 (file)
@@ -417,12 +417,7 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
-
        pagetable_init();
-
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
 }
 
 #ifdef CONFIG_64BIT
index babeb0e07687902bc2f5fb03e5049c22d209f729..082651facf4fb191f671cc6109835cb4964bc3ce 100644 (file)
@@ -413,9 +413,5 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init paging_init(void)
 {
-       unsigned long zones_size[MAX_NR_ZONES] = {0, };
-
        pagetable_init();
-       arch_zone_limits_init(zones_size);
-       free_area_init(zones_size);
 }
index 2cb666a65d9e215f59533dee8c29c2dbe8cc3889..6b22f1995c16163c84a7c3a2a7c6dd47d43480ec 100644 (file)
@@ -51,15 +51,9 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
  */
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
        pagetable_init();
        pgd_current = swapper_pg_dir;
 
-       arch_zone_limits_init(max_zone_pfn);
-       /* pass the memory from the bootmem allocator to the main allocator */
-       free_area_init(max_zone_pfn);
-
        flush_dcache_range((unsigned long)empty_zero_page,
                        (unsigned long)empty_zero_page + PAGE_SIZE);
 }
index 67de93e7a68573967886f83539567d2c7016ee38..78fb0734cdbc2340a1626a5491e4a971cd827373 100644 (file)
@@ -47,14 +47,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 }
 
-static void __init zone_sizes_init(void)
-{
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
-}
-
 extern const char _s_kernel_ro[], _e_kernel_ro[];
 
 /*
@@ -145,8 +137,6 @@ void __init paging_init(void)
 
        map_ram();
 
-       zone_sizes_init();
-
        /* self modifying code ;) */
        /* Since the old TLB miss handler has been running up until now,
         * the kernel pages are still all RW, so we can still modify the
index dc5bd3efe738a1e33ad2ff1f1ee99cf2b80ed534..ce6f09ab7a90d323f8e7fb1a6c937cc49ea1793c 100644 (file)
@@ -698,14 +698,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
        max_zone_pfns[ZONE_NORMAL] = PFN_DOWN(memblock_end_of_DRAM());
 }
 
-static void __init parisc_bootmem_free(void)
-{
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
-}
-
 void __init paging_init(void)
 {
        setup_bootmem();
@@ -716,7 +708,6 @@ void __init paging_init(void)
        flush_tlb_all_local(NULL);
 
        sparse_init();
-       parisc_bootmem_free();
 }
 
 static void alloc_btlb(unsigned long start, unsigned long end, int *slot,
index 03c05ec5604132c52098dd30979a750012ab2456..b716c9cd141c9ba23030fac09b204070dd901ca4 100644 (file)
@@ -237,7 +237,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
  */
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0 };
        unsigned long long total_ram = memblock_phys_mem_size();
        phys_addr_t top_of_ram = memblock_end_of_DRAM();
        int zone_dma_bits;
@@ -269,9 +268,6 @@ void __init paging_init(void)
 
        zone_dma_limit = DMA_BIT_MASK(zone_dma_bits);
 
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
-
        mark_nonram_nosave();
 }
 
index 97e8661fbcff1a4ede36fd333dd64f03ac7bcc66..79b4792578c46b3887448fe57cd2db91bf225685 100644 (file)
@@ -87,14 +87,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 }
 
-static void __init zone_sizes_init(void)
-{
-       unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, };
-
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
-}
-
 #if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM)
 
 #define LOG2_SZ_1K  ilog2(SZ_1K)
@@ -1443,7 +1435,6 @@ void __init misc_mem_init(void)
        /* The entire VMEMMAP region has been populated. Flush TLB for this region */
        local_flush_tlb_kernel_range(VMEMMAP_START, VMEMMAP_END);
 #endif
-       zone_sizes_init();
        arch_reserve_crashkernel();
        memblock_dump_all();
 }
index 1c11ad84dddbeb00fcfd726483b2b3260f9c7ca9..9ec608b5cbb1c9f61ec75cf423362d1cfd6a6060 100644 (file)
@@ -97,14 +97,9 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
  */
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
-
        vmem_map_init();
        sparse_init();
        zone_dma_limit = DMA_BIT_MASK(31);
-       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
 }
 
 void mark_rodata_ro(void)
index 5e7e636426114b425197a50f6a962ea34bd7848a..3edee854b7552dc60c7f507eb735bdc3c5f87cdf 100644 (file)
@@ -271,7 +271,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
        unsigned long vaddr, end;
 
        sh_mv.mv_mem_init();
@@ -325,10 +324,6 @@ void __init paging_init(void)
        page_table_range_init(vaddr, end, swapper_pg_dir);
 
        kmap_coherent_init();
-
-       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
 }
 
 unsigned int mem_init_done = 0;
index fbaad449dfc90823cef342b15cb6650bbcd9b0c0..931f872ce84a864645a3f820739154784850d819 100644 (file)
@@ -2459,17 +2459,6 @@ void __init paging_init(void)
 
        kernel_physical_mapping_init();
 
-       {
-               unsigned long max_zone_pfns[MAX_NR_ZONES];
-
-               memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-
-               max_zone_pfns[ZONE_NORMAL] = end_pfn;
-
-               arch_zone_limits_init(max_zone_pfns);
-               free_area_init(max_zone_pfns);
-       }
-
        printk("Booting Linux...\n");
 }
 
index 81e90151db9011a843169a6361dfac6d0bb280f8..1b24c5e8d73d970396612c3d8e7d6a4da6ddc081 100644 (file)
@@ -970,13 +970,6 @@ void __init srmmu_paging_init(void)
        flush_tlb_all();
 
        sparc_context_init(num_contexts);
-
-       {
-               unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
-               arch_zone_limits_init(max_zone_pfn);
-               free_area_init(max_zone_pfn);
-       }
 }
 
 void mmu_info(struct seq_file *m)
index 2ac4e9debedd06b305a3a85e770168e2b4bfe47f..89c8c8b94a79673fd71e5f645d27b6260c709847 100644 (file)
@@ -91,16 +91,11 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init paging_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
-
        empty_zero_page = (unsigned long *) memblock_alloc_low(PAGE_SIZE,
                                                               PAGE_SIZE);
        if (!empty_zero_page)
                panic("%s: Failed to allocate %lu bytes align=%lx\n",
                      __func__, PAGE_SIZE, PAGE_SIZE);
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
 }
 
 /*
index e7ef605a18d67bb934952c4c051f50d3c6c7e65e..e52a262d32077821bdf0df8744150b2551b20861 100644 (file)
@@ -1011,16 +1011,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 #endif
 }
 
-void __init zone_sizes_init(void)
-{
-       unsigned long max_zone_pfns[MAX_NR_ZONES];
-
-       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-
-       arch_zone_limits_init(max_zone_pfns);
-       free_area_init(max_zone_pfns);
-}
-
 __visible DEFINE_PER_CPU_ALIGNED(struct tlb_state, cpu_tlbstate) = {
        .loaded_mm = &init_mm,
        .next_asid = 1,
index 8a34fff6ab2b19f083f4fdf706de3ca0867416ba..b55172118c9148304a16c18547cff7d6cdf7165d 100644 (file)
@@ -655,7 +655,6 @@ void __init paging_init(void)
         */
        olpc_dt_build_devicetree();
        sparse_init();
-       zone_sizes_init();
 }
 
 /*
index 9983017ecbe0e30fc35f26e2af2ddb37572ebab9..4daa40071c9fd2f4df766890903d489a6ef74c1a 100644 (file)
@@ -843,8 +843,6 @@ void __init paging_init(void)
         */
        node_clear_state(0, N_MEMORY);
        node_clear_state(0, N_NORMAL_MEMORY);
-
-       zone_sizes_init();
 }
 
 #define PAGE_UNUSED 0xFD
index 097aadc250f7442986cde998b17bab5bada85e3e..7c4a41235323bd2dfde7684d78d84c0b873de825 100644 (file)
@@ -17,7 +17,6 @@ unsigned long kernel_physical_mapping_init(unsigned long start,
 unsigned long kernel_physical_mapping_change(unsigned long start,
                                             unsigned long end,
                                             unsigned long page_size_mask);
-void zone_sizes_init(void);
 
 extern int after_bootmem;
 
index 60299f359a3cf89020118ef08c4960163dc2a0d2..fe83a68335da29d2a5f97f5445309624747ee26f 100644 (file)
@@ -126,10 +126,6 @@ void __init arch_zone_limits_init(unsigned long *max_zone_pfns)
 
 void __init zones_init(void)
 {
-       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0, };
-
-       arch_zone_limits_init(max_zone_pfn);
-       free_area_init(max_zone_pfn);
        print_vm_layout();
 }
 
index 477339b7a032450690dc6727a81b7ade8a57ade5..aacabf8a0b58e69d2325a6bdb45e0ace59e4c75b 100644 (file)
@@ -45,6 +45,7 @@ struct pt_regs;
 struct folio_batch;
 
 void arch_mm_preinit(void);
+void mm_core_init_early(void);
 void mm_core_init(void);
 void init_mm_internals(void);
 
@@ -3540,7 +3541,7 @@ static inline unsigned long get_num_physpages(void)
 }
 
 /*
- * Using memblock node mappings, an architecture may initialise its
+ * FIXME: Using memblock node mappings, an architecture may initialise its
  * zones, allocate the backing mem_map and account for memory holes in an
  * architecture independent manner.
  *
@@ -3555,7 +3556,6 @@ static inline unsigned long get_num_physpages(void)
  *     memblock_add_node(base, size, nid, MEMBLOCK_NONE)
  * free_area_init(max_zone_pfns);
  */
-void free_area_init(unsigned long *max_zone_pfn);
 void arch_zone_limits_init(unsigned long *max_zone_pfn);
 unsigned long node_map_pfn_alignment(void);
 extern unsigned long absent_pages_in_range(unsigned long start_pfn,
index b84818ad9685f8a2bd4142425eb6db92efac5fd4..445b5643ecec153914dde281df886f7fcaaac068 100644 (file)
@@ -1025,6 +1025,7 @@ void start_kernel(void)
        page_address_init();
        pr_notice("%s", linux_banner);
        setup_arch(&command_line);
+       mm_core_init_early();
        /* Static keys and static calls are needed by LSMs */
        jump_label_init();
        static_call_init();
index 0927bedb12549c042dc3161552bfb27b46dc5105..6fb4415c0d1c8ca2eeb923b4857bdc93cf134881 100644 (file)
@@ -1807,7 +1807,6 @@ static void __init set_high_memory(void)
 
 /**
  * free_area_init - Initialise all pg_data_t and zone data
- * @max_zone_pfn: an array of max PFNs for each zone
  *
  * This will call free_area_init_node() for each active node in the system.
  * Using the page ranges provided by memblock_set_node(), the size of each
@@ -1818,17 +1817,14 @@ static void __init set_high_memory(void)
  * starts where the previous one ended. For example, ZONE_DMA32 starts
  * at arch_max_dma_pfn.
  */
-void __init free_area_init(unsigned long *max_zone_pfn)
+static void __init free_area_init(void)
 {
+       unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 };
        unsigned long start_pfn, end_pfn;
        int i, nid, zone;
        bool descending;
 
-       /* Record where the zone boundaries are */
-       memset(arch_zone_lowest_possible_pfn, 0,
-                               sizeof(arch_zone_lowest_possible_pfn));
-       memset(arch_zone_highest_possible_pfn, 0,
-                               sizeof(arch_zone_highest_possible_pfn));
+       arch_zone_limits_init(max_zone_pfn);
 
        start_pfn = PHYS_PFN(memblock_start_of_DRAM());
        descending = arch_has_descending_max_zone_pfns();
@@ -2678,13 +2674,19 @@ void __init __weak mem_init(void)
 {
 }
 
+void __init mm_core_init_early(void)
+{
+       hugetlb_bootmem_alloc();
+
+       free_area_init();
+}
+
 /*
  * Set up kernel memory allocators
  */
 void __init mm_core_init(void)
 {
        arch_mm_preinit();
-       hugetlb_bootmem_alloc();
 
        /* Initializations relying on SMP setup */
        BUILD_BUG_ON(MAX_ZONELISTS > 2);