h8300: switch to NO_BOOTMEM
PATCH 1/1 h8300: switch to NO_BOOTMEM
Commit 0fa1c579349f ("of/fdt: use memblock_virt_alloc for early alloc") inadvertently switched the DT unflattening allocations from memblock to bootmem which doesn't work because the unflattening happens before bootmem is initialized. Swapping the order of bootmem init and unflattening could also fix this, but removing bootmem is desired. So enable NO_BOOTMEM on h8300 like other architectures have done.
---
I haven't seen any reports, but 4.16 is likely broken. This is compile tested only.
Moving unflattening after bootmem_init should also work if a smaller change for 4.16 is desired.
Rob
arch/h8300/Kconfig | 1 + arch/h8300/kernel/setup.c | 36 ++++++++---------------------------- 2 files changed, 9 insertions(+), 28 deletions(-)
arch/h8300/Kconfig +1 -0
@@ -16,6 +16,7 @@ config H8300 select OF_IRQ select OF_EARLY_FLATTREE select HAVE_MEMBLOCK + select NO_BOOTMEM select TIMER_OF select H8300_TMR8 select HAVE_KERNEL_GZIP
arch/h8300/kernel/setup.c +8 -28
@@ -71,10 +71,6 @@ void __init h8300_fdt_init(void *fdt, char *bootargs)static void __init bootmem_init (void ) { -int bootmap_size; -unsigned long ram_start_pfn; -unsigned long free_ram_start_pfn; -unsigned long ram_end_pfn;struct memblock_region *region; memory_end = memory_start =0 ;
@@ -88,33 +84,17 @@ static void __init bootmem_init(void)if (!memory_end)panic ("No memory!" ); - ram_start_pfn =PFN_UP (memory_start); -/* free_ram_start_pfn is first page after kernel */ - free_ram_start_pfn =PFN_UP (__pa (_end)); - ram_end_pfn =PFN_DOWN (memblock_end_of_DRAM ()); +/* setup bootmem globals (we use no_bootmem, but mm still depends on this) */ + min_low_pfn =PFN_UP (memory_start); + max_low_pfn =PFN_DOWN (memblock_end_of_DRAM ()); + max_pfn = max_low_pfn; - max_pfn = ram_end_pfn; +memblock_reserve (__pa (_stext), _end - _stext); -/* -* give all the memory to the bootmap allocator, tell it to put the -* boot mem_map at the start of memory -*/ - bootmap_size =init_bootmem_node (NODE_DATA (0 ), - free_ram_start_pfn, -0 , - ram_end_pfn); -/* -* free the usable memory, we have to make sure we do not free -* the bootmem bitmap so we then reserve it after freeing it :-) -*/ -free_bootmem (PFN_PHYS (free_ram_start_pfn), - (ram_end_pfn - free_ram_start_pfn) <<PAGE_SHIFT ); -reserve_bootmem (PFN_PHYS (free_ram_start_pfn), bootmap_size, -BOOTMEM_DEFAULT ); +early_init_fdt_reserve_self (); +early_init_fdt_scan_reserved_mem (); -for_each_memblock (reserved, region) { -reserve_bootmem (region->base, region->size,BOOTMEM_DEFAULT ); - } +memblock_dump_all (); }void __init setup_arch (char **cmdline_p)
Signature · 1 line
2.14.1
Quoted 11 lines · Rob Herring
Commit
0fa1c579349f("of/fdt: usememblock_virt_allocfor early alloc") inadvertently switched the DT unflattening allocations from memblock to bootmem which doesn't work because the unflattening happens before bootmem is initialized. Swapping the order of bootmem init and unflattening could also fix this, but removing bootmem is desired. So enableNO_BOOTMEMon h8300 like other architectures have done.Fixes 0fa1c579349f ("of/fdt: use memblock_virt_alloc for early alloc")Cc Yoshinori Sato <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 6 lines
---
I haven't seen any reports, but 4.16 is likely broken. This is compile tested only.Moving unflattening after
bootmem_initshould also work if a smaller change for 4.16 is desired.
Ping! Someone going to pick this up?
Rob
Quoted 17 lines · Rob Herring
Quoted 15 lines · Rob Herring
Commit
0fa1c579349f("of/fdt: usememblock_virt_allocfor early alloc") inadvertently switched the DT unflattening allocations from memblock to bootmem which doesn't work because the unflattening happens before bootmem is initialized. Swapping the order of bootmem init and unflattening could also fix this, but removing bootmem is desired. So enableNO_BOOTMEMon h8300 like other architectures have done.Fixes 0fa1c579349f ("of/fdt: use memblock_virt_alloc for early alloc")Cc Yoshinori Sato <[email protected]>Signed-off-by Rob Herring <[email protected]>---
I haven't seen any reports, but 4.16 is likely broken. This is compile tested only.
Quoted 6 lines
Quoted 2 lines
Moving unflattening after
bootmem_initshould also work if a smaller change for 4.16 is desired.Ping! Someone going to pick this up?
Rob
Sorry. I looked out.
Please wait several days to confirm.
Signature · 1 line
Yosinori Sato
Quoted 12 lines · Rob Herring
Commit
0fa1c579349f("of/fdt: usememblock_virt_allocfor early alloc") inadvertently switched the DT unflattening allocations from memblock to bootmem which doesn't work because the unflattening happens before bootmem is initialized. Swapping the order of bootmem init and unflattening could also fix this, but removing bootmem is desired. So enableNO_BOOTMEMon h8300 like other architectures have done.Fixes 0fa1c579349f ("of/fdt: use memblock_virt_alloc for early alloc")Cc Yoshinori Sato <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 6 lines
---
I haven't seen any reports, but 4.16 is likely broken. This is compile tested only.Moving unflattening after
bootmem_initshould also work if a smaller change for 4.16 is desired.
It's works fine.
Applied to h8300-next.
Thanks.
Quoted 78 lines
Rob
arch/h8300/Kconfig | 1 + arch/h8300/kernel/setup.c | 36 ++++++++---------------------------- 2 files changed, 9 insertions(+), 28 deletions(-)arch/h8300/Kconfig +1
-0@@ -16,6 +16,7 @@ config H8300 select OF_IRQ select OF_EARLY_FLATTREE select HAVE_MEMBLOCK + select NO_BOOTMEM select TIMER_OF select H8300_TMR8 select HAVE_KERNEL_GZIParch/h8300/kernel/setup.c +8
-28@@ -71,10 +71,6 @@ void __init h8300_fdt_init(void *fdt, char *bootargs)static void __init bootmem_init (void ) { -int bootmap_size; -unsigned long ram_start_pfn; -unsigned long free_ram_start_pfn; -unsigned long ram_end_pfn;struct memblock_region *region; memory_end = memory_start =0 ;@@ -88,33 +84,17 @@ static void __init bootmem_init(void)if (!memory_end)panic ("No memory!" ); - ram_start_pfn =PFN_UP (memory_start); -/* free_ram_start_pfn is first page after kernel */ - free_ram_start_pfn =PFN_UP (__pa (_end)); - ram_end_pfn =PFN_DOWN (memblock_end_of_DRAM ()); +/* setup bootmem globals (we use no_bootmem, but mm still depends on this) */ + min_low_pfn =PFN_UP (memory_start); + max_low_pfn =PFN_DOWN (memblock_end_of_DRAM ()); + max_pfn = max_low_pfn; - max_pfn = ram_end_pfn; +memblock_reserve (__pa (_stext), _end - _stext); -/* -* give all the memory to the bootmap allocator, tell it to put the -* boot mem_map at the start of memory -*/ - bootmap_size =init_bootmem_node (NODE_DATA (0 ), - free_ram_start_pfn, -0 , - ram_end_pfn); -/* -* free the usable memory, we have to make sure we do not free -* the bootmem bitmap so we then reserve it after freeing it :-) -*/ -free_bootmem (PFN_PHYS (free_ram_start_pfn), - (ram_end_pfn - free_ram_start_pfn) <<PAGE_SHIFT ); -reserve_bootmem (PFN_PHYS (free_ram_start_pfn), bootmap_size, -BOOTMEM_DEFAULT ); +early_init_fdt_reserve_self (); +early_init_fdt_scan_reserved_mem (); -for_each_memblock (reserved, region) { -reserve_bootmem (region->base, region->size,BOOTMEM_DEFAULT ); - } +memblock_dump_all (); }void __init setup_arch (char **cmdline_p)Signature · 1 line
2.14.1
Signature · 2 lines
Yoshinori Sato <[email protected]>