Message ID | 20250306185124.3147510-3-rppt@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | arch, mm: reduce code duplication in mem_init() | expand |
Move setup_initrd from mem_init into memblock_init, that LGTM. Acked by: Guo Ren (csky) <guoren@kernel.org> On Fri, Mar 7, 2025 at 2:52 AM Mike Rapoport <rppt@kernel.org> wrote: > > From: "Mike Rapoport (Microsoft)" <rppt@kernel.org> > > Memory used by initrd should be reserved as soon as possible before > there any memblock allocations that might overwrite that memory. > > This will also help with pulling out memblock_free_all() to the generic > code and reducing code duplication in arch::mem_init(). > > Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org> > --- > arch/csky/kernel/setup.c | 43 ++++++++++++++++++++++++++++++++++++++++ > arch/csky/mm/init.c | 43 ---------------------------------------- > 2 files changed, 43 insertions(+), 43 deletions(-) > > diff --git a/arch/csky/kernel/setup.c b/arch/csky/kernel/setup.c > index fe715b707fd0..e0d6ca86ea8c 100644 > --- a/arch/csky/kernel/setup.c > +++ b/arch/csky/kernel/setup.c > @@ -12,6 +12,45 @@ > #include <asm/mmu_context.h> > #include <asm/pgalloc.h> > > +#ifdef CONFIG_BLK_DEV_INITRD > +static void __init setup_initrd(void) > +{ > + unsigned long size; > + > + if (initrd_start >= initrd_end) { > + pr_err("initrd not found or empty"); > + goto disable; > + } > + > + if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { > + pr_err("initrd extends beyond end of memory"); > + goto disable; > + } > + > + size = initrd_end - initrd_start; > + > + if (memblock_is_region_reserved(__pa(initrd_start), size)) { > + pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region", > + __pa(initrd_start), size); > + goto disable; > + } > + > + memblock_reserve(__pa(initrd_start), size); > + > + pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n", > + (void *)(initrd_start), size); > + > + initrd_below_start_ok = 1; > + > + return; > + > +disable: > + initrd_start = initrd_end = 0; > + > + pr_err(" - disabling initrd\n"); > +} > +#endif > + > static void __init csky_memblock_init(void) > { > unsigned long lowmem_size = PFN_DOWN(LOWMEM_LIMIT - PHYS_OFFSET_OFFSET); > @@ -40,6 +79,10 @@ static void __init csky_memblock_init(void) > max_low_pfn = min_low_pfn + sseg_size; > } > > +#ifdef CONFIG_BLK_DEV_INITRD > + setup_initrd(); > +#endif > + > max_zone_pfn[ZONE_NORMAL] = max_low_pfn; > > mmu_init(min_low_pfn, max_low_pfn); > diff --git a/arch/csky/mm/init.c b/arch/csky/mm/init.c > index bde7cabd23df..ab51acbc19b2 100644 > --- a/arch/csky/mm/init.c > +++ b/arch/csky/mm/init.c > @@ -42,45 +42,6 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] > __page_aligned_bss; > EXPORT_SYMBOL(empty_zero_page); > > -#ifdef CONFIG_BLK_DEV_INITRD > -static void __init setup_initrd(void) > -{ > - unsigned long size; > - > - if (initrd_start >= initrd_end) { > - pr_err("initrd not found or empty"); > - goto disable; > - } > - > - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { > - pr_err("initrd extends beyond end of memory"); > - goto disable; > - } > - > - size = initrd_end - initrd_start; > - > - if (memblock_is_region_reserved(__pa(initrd_start), size)) { > - pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region", > - __pa(initrd_start), size); > - goto disable; > - } > - > - memblock_reserve(__pa(initrd_start), size); > - > - pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n", > - (void *)(initrd_start), size); > - > - initrd_below_start_ok = 1; > - > - return; > - > -disable: > - initrd_start = initrd_end = 0; > - > - pr_err(" - disabling initrd\n"); > -} > -#endif > - > void __init mem_init(void) > { > #ifdef CONFIG_HIGHMEM > @@ -92,10 +53,6 @@ void __init mem_init(void) > #endif > high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); > > -#ifdef CONFIG_BLK_DEV_INITRD > - setup_initrd(); > -#endif > - > memblock_free_all(); > > #ifdef CONFIG_HIGHMEM > -- > 2.47.2 >
diff --git a/arch/csky/kernel/setup.c b/arch/csky/kernel/setup.c index fe715b707fd0..e0d6ca86ea8c 100644 --- a/arch/csky/kernel/setup.c +++ b/arch/csky/kernel/setup.c @@ -12,6 +12,45 @@ #include <asm/mmu_context.h> #include <asm/pgalloc.h> +#ifdef CONFIG_BLK_DEV_INITRD +static void __init setup_initrd(void) +{ + unsigned long size; + + if (initrd_start >= initrd_end) { + pr_err("initrd not found or empty"); + goto disable; + } + + if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { + pr_err("initrd extends beyond end of memory"); + goto disable; + } + + size = initrd_end - initrd_start; + + if (memblock_is_region_reserved(__pa(initrd_start), size)) { + pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region", + __pa(initrd_start), size); + goto disable; + } + + memblock_reserve(__pa(initrd_start), size); + + pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n", + (void *)(initrd_start), size); + + initrd_below_start_ok = 1; + + return; + +disable: + initrd_start = initrd_end = 0; + + pr_err(" - disabling initrd\n"); +} +#endif + static void __init csky_memblock_init(void) { unsigned long lowmem_size = PFN_DOWN(LOWMEM_LIMIT - PHYS_OFFSET_OFFSET); @@ -40,6 +79,10 @@ static void __init csky_memblock_init(void) max_low_pfn = min_low_pfn + sseg_size; } +#ifdef CONFIG_BLK_DEV_INITRD + setup_initrd(); +#endif + max_zone_pfn[ZONE_NORMAL] = max_low_pfn; mmu_init(min_low_pfn, max_low_pfn); diff --git a/arch/csky/mm/init.c b/arch/csky/mm/init.c index bde7cabd23df..ab51acbc19b2 100644 --- a/arch/csky/mm/init.c +++ b/arch/csky/mm/init.c @@ -42,45 +42,6 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss; EXPORT_SYMBOL(empty_zero_page); -#ifdef CONFIG_BLK_DEV_INITRD -static void __init setup_initrd(void) -{ - unsigned long size; - - if (initrd_start >= initrd_end) { - pr_err("initrd not found or empty"); - goto disable; - } - - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { - pr_err("initrd extends beyond end of memory"); - goto disable; - } - - size = initrd_end - initrd_start; - - if (memblock_is_region_reserved(__pa(initrd_start), size)) { - pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region", - __pa(initrd_start), size); - goto disable; - } - - memblock_reserve(__pa(initrd_start), size); - - pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n", - (void *)(initrd_start), size); - - initrd_below_start_ok = 1; - - return; - -disable: - initrd_start = initrd_end = 0; - - pr_err(" - disabling initrd\n"); -} -#endif - void __init mem_init(void) { #ifdef CONFIG_HIGHMEM @@ -92,10 +53,6 @@ void __init mem_init(void) #endif high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); -#ifdef CONFIG_BLK_DEV_INITRD - setup_initrd(); -#endif - memblock_free_all(); #ifdef CONFIG_HIGHMEM