[PATCH] arm64: mm: move dma_contiguous_reserve() to be after paging_init()
Barry Song
song.bao.hua at hisilicon.com
Wed Sep 16 04:59:33 EDT 2020
Recent CMA change "cma: make number of CMA areas dynamic, remove
CONFIG_CMA_AREAS" breaks the boot of arm64 kernel in linux-next.
Knic is like:
Unable to handle kernel paging request at virtual address ffff0000438fff70
Mem abort info:
ESR = 0x96000044
EC = 0x25: DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000044
CM = 0, WnR = 1
swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000041f61000
[ffff0000438fff70] pgd=0000000000000000, p4d=0000000000000000
Internal error: Oops: 96000044 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Not tainted 5.9.0-rc3-00020-ge1bce3d64c48 #2
Hardware name: linux,dummy-virt (DT)
pstate: 20000085 (nzCv daIf -PAN -UAO BTYPE=--)
pc : __memset+0x148/0x188
lr : memblock_alloc_try_nid+0xbc/0xd4
sp : ffff800011ab3d10
x29: ffff800011ab3d10 x28: 0000000041710018
x27: 0000000040000000 x26: ffff8000115d1000
x25: 0000000000000000 x24: ffff800011300428
x23: ffff800011d1bd60 x22: 0000000000000000
x21: 00000000ffffffff x20: ffff0000438fff70
x19: 0000000000000090 x18: 0000000000000010
x17: 0000000000001400 x16: 0000000000001c00
x15: ffff800011ac3530 x14: ffff800011ac3530
x13: fffffdfffe600000 x12: ffff800011ab3e44
x11: 0000000000000004 x10: 0000000000000018
x9 : 0000000000000000 x8 : ffff0000438fff70
x7 : 0000000000000000 x6 : 000000000000003f
x5 : 0000000000000040 x4 : 0000000000000010
x3 : 0000000000000080 x2 : 0000000000000080
x1 : 0000000000000000 x0 : ffff0000438fff70
Call trace:
__memset+0x148/0x188
cma_init_reserved_mem+0x94/0x154
cma_declare_contiguous_nid+0x240/0x2bc
dma_contiguous_reserve_area+0x48/0x78
dma_contiguous_reserve+0x78/0x88
arm64_memblock_init+0x424/0x45c
setup_arch+0x270/0x5f0
start_kernel+0x84/0x4dc
Code: f101007f fa45a068 54fffc0b aa0303e2 (a9001d07)
random: get_random_bytes called from print_oops_end_marker+0x2c/0x68 with crng_init=0
---[ end trace 0000000000000000 ]---
Kernel panic - not syncing: Attempted to kill the idle task!
---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---
The virtual address returned from memblock_alloc() is not ready till
paging_init() is done.
Cc: Roman Gushchin <guro at fb.com>
Cc: Mike Kravetz <mike.kravetz at oracle.com>
Cc: Andrew Morton <akpm at linux-foundation.org>
Cc: Will Deacon <will at kernel.org>
Cc: Stephen Rothwell <sfr at canb.auug.org.au>
Signed-off-by: Barry Song <song.bao.hua at hisilicon.com>
---
-v1: to fix the knic during boot after applying Mike's patch:
https://lore.kernel.org/linux-mm/20200915205703.34572-1-mike.kravetz@oracle.com/
arch/arm64/mm/init.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index f1c75957ff3c..8dd61d07fff5 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -402,8 +402,6 @@ void __init arm64_memblock_init(void)
reserve_elfcorehdr();
high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
-
- dma_contiguous_reserve(arm64_dma32_phys_limit);
}
void __init bootmem_init(void)
@@ -415,6 +413,13 @@ void __init bootmem_init(void)
early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);
+ /*
+ * CMA is using memblock_alloc(), the virtual address returned
+ * from memblock_alloc() isn't ready till paging_init().
+ * So this has to happen after paging_init()
+ */
+ dma_contiguous_reserve(arm64_dma32_phys_limit);
+
max_pfn = max_low_pfn = max;
min_low_pfn = min;
--
2.25.1
More information about the linux-arm-kernel
mailing list