Message ID | 20190213115301.103989-3-anup.patel@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fixmap support and MM cleanups | expand |
On Wed, Feb 13, 2019 at 11:53:37AM +0000, Anup Patel wrote: > The setup_bootmem() mainly populates memblocks and does early memory > reservations. The right location for this function is mm/init.c. It > calls setup_initrd() so we move that as well. > > Signed-off-by: Anup Patel <anup.patel@wdc.com> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Palmer Dabbelt <palmer@sifive.com> Reviewed-by: Mike Rapoport <rppt@linux.ibm.com> > --- > arch/riscv/include/asm/pgtable.h | 1 + > arch/riscv/kernel/setup.c | 72 -------------------------------- > arch/riscv/mm/init.c | 70 +++++++++++++++++++++++++++++++ > 3 files changed, 71 insertions(+), 72 deletions(-) > > diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h > index 16301966d65b..35893810cba3 100644 > --- a/arch/riscv/include/asm/pgtable.h > +++ b/arch/riscv/include/asm/pgtable.h > @@ -404,6 +404,7 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma, > #define kern_addr_valid(addr) (1) /* FIXME */ > #endif > > +extern void setup_bootmem(void); > extern void paging_init(void); > > static inline void pgtable_cache_init(void) > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c > index c6e858122815..49bce6692f39 100644 > --- a/arch/riscv/kernel/setup.c > +++ b/arch/riscv/kernel/setup.c > @@ -23,7 +23,6 @@ > #include <linux/mm.h> > #include <linux/memblock.h> > #include <linux/sched.h> > -#include <linux/initrd.h> > #include <linux/console.h> > #include <linux/screen_info.h> > #include <linux/of_fdt.h> > @@ -70,34 +69,6 @@ void __init smp_setup_processor_id(void) > cpuid_to_hartid_map(0) = boot_cpu_hartid; > } > > -#ifdef CONFIG_BLK_DEV_INITRD > -static void __init setup_initrd(void) > -{ > - unsigned long size; > - > - if (initrd_start >= initrd_end) { > - printk(KERN_INFO "initrd not found or empty"); > - goto disable; > - } > - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { > - printk(KERN_ERR "initrd extends beyond end of memory"); > - goto disable; > - } > - > - size = initrd_end - initrd_start; > - memblock_reserve(__pa(initrd_start), size); > - initrd_below_start_ok = 1; > - > - printk(KERN_INFO "Initial ramdisk at: 0x%p (%lu bytes)\n", > - (void *)(initrd_start), size); > - return; > -disable: > - pr_cont(" - disabling initrd\n"); > - initrd_start = 0; > - initrd_end = 0; > -} > -#endif /* CONFIG_BLK_DEV_INITRD */ > - > pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss; > pgd_t trampoline_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); > > @@ -159,49 +130,6 @@ void __init parse_dtb(unsigned int hartid, void *dtb) > #endif > } > > -static void __init setup_bootmem(void) > -{ > - struct memblock_region *reg; > - phys_addr_t mem_size = 0; > - > - /* Find the memory region containing the kernel */ > - for_each_memblock(memory, reg) { > - phys_addr_t vmlinux_end = __pa(_end); > - phys_addr_t end = reg->base + reg->size; > - > - if (reg->base <= vmlinux_end && vmlinux_end <= end) { > - /* > - * Reserve from the start of the region to the end of > - * the kernel > - */ > - memblock_reserve(reg->base, vmlinux_end - reg->base); > - mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET); > - } > - } > - BUG_ON(mem_size == 0); > - > - set_max_mapnr(PFN_DOWN(mem_size)); > - max_low_pfn = PFN_DOWN(memblock_end_of_DRAM()); > - > -#ifdef CONFIG_BLK_DEV_INITRD > - setup_initrd(); > -#endif /* CONFIG_BLK_DEV_INITRD */ > - > - early_init_fdt_reserve_self(); > - early_init_fdt_scan_reserved_mem(); > - memblock_allow_resize(); > - memblock_dump_all(); > - > - for_each_memblock(memory, reg) { > - unsigned long start_pfn = memblock_region_memory_base_pfn(reg); > - unsigned long end_pfn = memblock_region_memory_end_pfn(reg); > - > - memblock_set_node(PFN_PHYS(start_pfn), > - PFN_PHYS(end_pfn - start_pfn), > - &memblock.memory, 0); > - } > -} > - > void __init setup_arch(char **cmdline_p) > { > init_mm.start_code = (unsigned long) _stext; > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index 658ebf645f42..bedaf04f9c2f 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -17,6 +17,7 @@ > #include <linux/initrd.h> > #include <linux/swap.h> > #include <linux/sizes.h> > +#include <linux/of_fdt.h> > > #include <asm/tlbflush.h> > #include <asm/sections.h> > @@ -66,7 +67,76 @@ void free_initmem(void) > } > > #ifdef CONFIG_BLK_DEV_INITRD > +static void __init setup_initrd(void) > +{ > + unsigned long size; > + > + if (initrd_start >= initrd_end) { > + printk(KERN_INFO "initrd not found or empty"); > + goto disable; > + } > + if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { > + printk(KERN_ERR "initrd extends beyond end of memory"); > + goto disable; > + } > + > + size = initrd_end - initrd_start; > + memblock_reserve(__pa(initrd_start), size); > + initrd_below_start_ok = 1; > + > + printk(KERN_INFO "Initial ramdisk at: 0x%p (%lu bytes)\n", > + (void *)(initrd_start), size); > + return; > +disable: > + pr_cont(" - disabling initrd\n"); > + initrd_start = 0; > + initrd_end = 0; > +} > + > void free_initrd_mem(unsigned long start, unsigned long end) > { > } > #endif /* CONFIG_BLK_DEV_INITRD */ > + > +void __init setup_bootmem(void) > +{ > + struct memblock_region *reg; > + phys_addr_t mem_size = 0; > + > + /* Find the memory region containing the kernel */ > + for_each_memblock(memory, reg) { > + phys_addr_t vmlinux_end = __pa(_end); > + phys_addr_t end = reg->base + reg->size; > + > + if (reg->base <= vmlinux_end && vmlinux_end <= end) { > + /* > + * Reserve from the start of the region to the end of > + * the kernel > + */ > + memblock_reserve(reg->base, vmlinux_end - reg->base); > + mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET); > + } > + } > + BUG_ON(mem_size == 0); > + > + set_max_mapnr(PFN_DOWN(mem_size)); > + max_low_pfn = PFN_DOWN(memblock_end_of_DRAM()); > + > +#ifdef CONFIG_BLK_DEV_INITRD > + setup_initrd(); > +#endif /* CONFIG_BLK_DEV_INITRD */ > + > + early_init_fdt_reserve_self(); > + early_init_fdt_scan_reserved_mem(); > + memblock_allow_resize(); > + memblock_dump_all(); > + > + for_each_memblock(memory, reg) { > + unsigned long start_pfn = memblock_region_memory_base_pfn(reg); > + unsigned long end_pfn = memblock_region_memory_end_pfn(reg); > + > + memblock_set_node(PFN_PHYS(start_pfn), > + PFN_PHYS(end_pfn - start_pfn), > + &memblock.memory, 0); > + } > +} > -- > 2.17.1 >
diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index 16301966d65b..35893810cba3 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -404,6 +404,7 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma, #define kern_addr_valid(addr) (1) /* FIXME */ #endif +extern void setup_bootmem(void); extern void paging_init(void); static inline void pgtable_cache_init(void) diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c index c6e858122815..49bce6692f39 100644 --- a/arch/riscv/kernel/setup.c +++ b/arch/riscv/kernel/setup.c @@ -23,7 +23,6 @@ #include <linux/mm.h> #include <linux/memblock.h> #include <linux/sched.h> -#include <linux/initrd.h> #include <linux/console.h> #include <linux/screen_info.h> #include <linux/of_fdt.h> @@ -70,34 +69,6 @@ void __init smp_setup_processor_id(void) cpuid_to_hartid_map(0) = boot_cpu_hartid; } -#ifdef CONFIG_BLK_DEV_INITRD -static void __init setup_initrd(void) -{ - unsigned long size; - - if (initrd_start >= initrd_end) { - printk(KERN_INFO "initrd not found or empty"); - goto disable; - } - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { - printk(KERN_ERR "initrd extends beyond end of memory"); - goto disable; - } - - size = initrd_end - initrd_start; - memblock_reserve(__pa(initrd_start), size); - initrd_below_start_ok = 1; - - printk(KERN_INFO "Initial ramdisk at: 0x%p (%lu bytes)\n", - (void *)(initrd_start), size); - return; -disable: - pr_cont(" - disabling initrd\n"); - initrd_start = 0; - initrd_end = 0; -} -#endif /* CONFIG_BLK_DEV_INITRD */ - pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss; pgd_t trampoline_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); @@ -159,49 +130,6 @@ void __init parse_dtb(unsigned int hartid, void *dtb) #endif } -static void __init setup_bootmem(void) -{ - struct memblock_region *reg; - phys_addr_t mem_size = 0; - - /* Find the memory region containing the kernel */ - for_each_memblock(memory, reg) { - phys_addr_t vmlinux_end = __pa(_end); - phys_addr_t end = reg->base + reg->size; - - if (reg->base <= vmlinux_end && vmlinux_end <= end) { - /* - * Reserve from the start of the region to the end of - * the kernel - */ - memblock_reserve(reg->base, vmlinux_end - reg->base); - mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET); - } - } - BUG_ON(mem_size == 0); - - set_max_mapnr(PFN_DOWN(mem_size)); - max_low_pfn = PFN_DOWN(memblock_end_of_DRAM()); - -#ifdef CONFIG_BLK_DEV_INITRD - setup_initrd(); -#endif /* CONFIG_BLK_DEV_INITRD */ - - early_init_fdt_reserve_self(); - early_init_fdt_scan_reserved_mem(); - memblock_allow_resize(); - memblock_dump_all(); - - for_each_memblock(memory, reg) { - unsigned long start_pfn = memblock_region_memory_base_pfn(reg); - unsigned long end_pfn = memblock_region_memory_end_pfn(reg); - - memblock_set_node(PFN_PHYS(start_pfn), - PFN_PHYS(end_pfn - start_pfn), - &memblock.memory, 0); - } -} - void __init setup_arch(char **cmdline_p) { init_mm.start_code = (unsigned long) _stext; diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 658ebf645f42..bedaf04f9c2f 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -17,6 +17,7 @@ #include <linux/initrd.h> #include <linux/swap.h> #include <linux/sizes.h> +#include <linux/of_fdt.h> #include <asm/tlbflush.h> #include <asm/sections.h> @@ -66,7 +67,76 @@ void free_initmem(void) } #ifdef CONFIG_BLK_DEV_INITRD +static void __init setup_initrd(void) +{ + unsigned long size; + + if (initrd_start >= initrd_end) { + printk(KERN_INFO "initrd not found or empty"); + goto disable; + } + if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { + printk(KERN_ERR "initrd extends beyond end of memory"); + goto disable; + } + + size = initrd_end - initrd_start; + memblock_reserve(__pa(initrd_start), size); + initrd_below_start_ok = 1; + + printk(KERN_INFO "Initial ramdisk at: 0x%p (%lu bytes)\n", + (void *)(initrd_start), size); + return; +disable: + pr_cont(" - disabling initrd\n"); + initrd_start = 0; + initrd_end = 0; +} + void free_initrd_mem(unsigned long start, unsigned long end) { } #endif /* CONFIG_BLK_DEV_INITRD */ + +void __init setup_bootmem(void) +{ + struct memblock_region *reg; + phys_addr_t mem_size = 0; + + /* Find the memory region containing the kernel */ + for_each_memblock(memory, reg) { + phys_addr_t vmlinux_end = __pa(_end); + phys_addr_t end = reg->base + reg->size; + + if (reg->base <= vmlinux_end && vmlinux_end <= end) { + /* + * Reserve from the start of the region to the end of + * the kernel + */ + memblock_reserve(reg->base, vmlinux_end - reg->base); + mem_size = min(reg->size, (phys_addr_t)-PAGE_OFFSET); + } + } + BUG_ON(mem_size == 0); + + set_max_mapnr(PFN_DOWN(mem_size)); + max_low_pfn = PFN_DOWN(memblock_end_of_DRAM()); + +#ifdef CONFIG_BLK_DEV_INITRD + setup_initrd(); +#endif /* CONFIG_BLK_DEV_INITRD */ + + early_init_fdt_reserve_self(); + early_init_fdt_scan_reserved_mem(); + memblock_allow_resize(); + memblock_dump_all(); + + for_each_memblock(memory, reg) { + unsigned long start_pfn = memblock_region_memory_base_pfn(reg); + unsigned long end_pfn = memblock_region_memory_end_pfn(reg); + + memblock_set_node(PFN_PHYS(start_pfn), + PFN_PHYS(end_pfn - start_pfn), + &memblock.memory, 0); + } +}