Move setup_initrd from mem_init into memblock_init, that LGTM. Acked by: Guo Ren (csky) <guoren@xxxxxxxxxx> On Fri, Mar 7, 2025 at 2:52 AM Mike Rapoport <rppt@xxxxxxxxxx> wrote: > > From: "Mike Rapoport (Microsoft)" <rppt@xxxxxxxxxx> > > 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@xxxxxxxxxx> > --- > 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 > -- Best Regards Guo Ren