Message ID | 20160721005756.GN20774@linaro.org |
---|---|
State | New |
Headers | show |
James, On Fri, Jul 22, 2016 at 02:55:02PM +0100, James Morse wrote: > Hi, > > On 21/07/16 01:57, AKASHI Takahiro wrote: > > Could you please apply the diff attached below and confirm that > > kdump works in your environment? > > I can't test it by myself since my hikey board seems to be broken now. > > With this I get a failure even earlier, even with 'acpi=off'. > With this patch, on boot of the kdump kernel I get: I think you ran into the problem that I mentioned in: http://lists.infradead.org/pipermail/linux-arm-kernel/2016-July/444500.html You may want to - apply the change stated above, or (Given that we don't know about the configuration of crash dump kernel, checking for CONFIG_ZONE_DMA doesn't make sense. Instead, we'd better always enforce ARCH_LOW_ADDRESS_LIMIT.) - explicitly specify the start address (Y) below ARCH_LOW_ADDRESS_LIMIT at "crashkernel=X@Y" Either would work. Thanks, -Takahiro AKASHI > [ 0.000000] Linux version 4.7.0-rc4+ (morse@melchizedek) (gcc version 5.2.1 6 > [ 0.000000] Boot CPU: AArch64 Processor [411fd071] > [ 0.000000] earlycon: pl11 at MMIO 0x000000007ff80000 (options '') > [ 0.000000] bootconsole [pl11] enabled > [ 0.000000] debug: ignoring loglevel setting. > [ 0.000000] efi: Getting EFI parameters from FDT: > [ 0.000000] efi: EFI v2.50 by ARM Juno EFI Nov 24 2015 12:36:35 > [ 0.000000] efi: ACPI=0xf95b0000 ACPI 2.0=0xf95b0014 PROP=0xfe8db4d8 > [ 0.000000] Reserving 1KB of memory at 0x9fffff000 for elfcorehdr > [ 0.000000] cma: Failed to reserve 16 MiB > [ 0.000000] On node 0 totalpages: 132160 > [ 0.000000] DMA zone: 17 pages used for memmap > [ 0.000000] DMA zone: 0 pages reserved > [ 0.000000] DMA zone: 1088 pages, LIFO batch:0 > [ 0.000000] Normal zone: 2048 pages used for memmap > [ 0.000000] Normal zone: 131072 pages, LIFO batch:31 > [ 0.000000] bootmem alloc of 64 bytes failed! > [ 0.000000] Kernel panic - not syncing: Out of memory > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.7.0-rc4+ #4600 > [ 0.000000] Hardware name: ARM Juno development board (r1) (DT) > [ 0.000000] Call trace: > [ 0.000000] [<ffff0000080889a8>] dump_backtrace+0x0/0x1e8 > [ 0.000000] [<ffff000008088ba4>] show_stack+0x14/0x20 > [ 0.000000] [<ffff000008363274>] dump_stack+0x94/0xb8 > [ 0.000000] [<ffff00000816192c>] panic+0x10c/0x278 > [ 0.000000] [<ffff000008b14980>] free_bootmem_late+0x0/0xa0 > [ 0.000000] [<ffff000008b14e68>] __alloc_bootmem_low+0x2c/0x38 > [ 0.000000] [<ffff000008b02954>] setup_arch+0x2e4/0x5ac > [ 0.000000] [<ffff000008b00854>] start_kernel+0x70/0x390 > [ 0.000000] [<ffff000008b001bc>] __primary_switched+0x30/0x6c > [ 0.000000] ---[ end Kernel panic - not syncing: Out of memory > > > Trying again, booted with: > > console=ttyAMA0,115200 earlycon=pl011,0x7ff80000 root=/dev/nfs > > nfsroot=10.X.X.X:/ubuntu-15.04-server-arm64,v3 resume=/dev/sda2 no_console_suspend > > ip=dhcp rw crashkernel=512M stacktrace ignore_loglevel=1 acpi=off efi=debug > memblock=debug > > kexec-tools invoked as: > > kexec -x --reuse-cmdline --dtb=/sys/firmware/fdt -p /aarch64-Image > > cat /proc/iomem | grep Crash: > > 9e0000000-9ffffffff : Crash kernel > > crash kernel memblock before call to memblock_cap_memory_range(): > [ 0.000000] MEMBLOCK configuration: > [ 0.000000] memory size = 0x1fef10000 reserved size = 0x4f3b > [ 0.000000] memory.cnt = 0x9 > [ 0.000000] memory[0x0] [0x00000080000000-0x000000dfffffff], 0x60000000 > bytes flags: 0x0 > [ 0.000000] memory[0x1] [0x000000e00f0000-0x000000f949ffff], 0x193b0000 > bytes flags: 0x0 > (uefi runtime code|data|acpi:) > [ 0.000000] memory[0x2] [0x000000f94a0000-0x000000f984ffff], 0x3b0000 > bytes flags: 0x4 > [ 0.000000] memory[0x3] [0x000000f9850000-0x000000fe81ffff], 0x4fd0000 > bytes flags: 0x0 > (uefi runtime data:) > [ 0.000000] memory[0x4] [0x000000fe820000-0x000000fe85ffff], 0x40000 > bytes flags: 0x4 > [ 0.000000] memory[0x5] [0x000000fe860000-0x000000fe86ffff], 0x10000 > bytes flags: 0x0 > (uefi runtime data:) > [ 0.000000] memory[0x6] [0x000000fe870000-0x000000fe8bffff], 0x50000 > bytes flags: 0x4 > [ 0.000000] memory[0x7] [0x000000fe8c0000-0x000000feffffff], 0x740000 > bytes flags: 0x0 > [ 0.000000] memory[0x8] [0x00000880000000-0x000009ffffffff], 0x180000000 > bytes flags: 0x0 > [ 0.000000] reserved.cnt = 0x2 > (uefi memory map:) > [ 0.000000] reserved[0x0] [0x000000f985a000-0x000000f985afff], 0x1000 > bytes flags: 0x0 > (device tree:) > [ 0.000000] reserved[0x1] [0x000009e0ce0000-0x000009e0ce3f3a], 0x3f3b > bytes flags: 0x0 > > crash kernel memblock after call to memblock_cap_memory_range(): > [ 0.000000] MEMBLOCK configuration: > [ 0.000000] memory size = 0x20440000 reserved size = 0x3f3b > [ 0.000000] memory.cnt = 0x4 > [ 0.000000] memory[0x0] [0x000000f94a0000-0x000000f984ffff], 0x3b0000 > bytes flags: 0x4 > [ 0.000000] memory[0x1] [0x000000fe820000-0x000000fe85ffff], 0x40000 > bytes flags: 0x4 > [ 0.000000] memory[0x2] [0x000000fe870000-0x000000fe8bffff], 0x50000 > bytes flags: 0x4 > [ 0.000000] memory[0x3] [0x000009e0000000-0x000009ffffffff], 0x20000000 > bytes flags: 0x0 > [ 0.000000] reserved.cnt = 0x1 > [ 0.000000] reserved[0x0] [0x000009e0ce0000-0x000009e0ce3f3a], 0x3f3b > bytes flags: 0x0 > (reserve kernel text:) > [ 0.000000] memblock_reserve: [0x000009e0080000-0x000009e0cd0fff] flags 0x0 > arm64_memblock_init+0x1e0/0x40c > (reserve elfcorehdr:) > [ 0.000000] memblock_reserve: [0x000009fffff000-0x000009fffff3ff] flags 0x0 > arm64_memblock_init+0x37c/0x40c > [ 0.000000] Reserving 1KB of memory at 0x9fffff000 for elfcorehdr > [ 0.000000] cma: Failed to reserve 16 MiB > ... > > It looks like memblock_cap_memory_range() did exactly what you intended > > This first fault seems to be because memblock_start_of_DRAM() is being dragged > down by the preserved nomap areas, this means there isn't any usable memory > within ~4G of memblock_start_of_DRAM()... > > I will dig into the bootmem alloc failure next week... > > (let me know if you want the full boot logs... they are more noise than signal) > > > Thanks, > > James > > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
James, On Mon, Jul 25, 2016 at 02:27:55PM +0900, AKASHI Takahiro wrote: > James, > > On Fri, Jul 22, 2016 at 02:55:02PM +0100, James Morse wrote: > > Hi, > > > > On 21/07/16 01:57, AKASHI Takahiro wrote: > > > Could you please apply the diff attached below and confirm that > > > kdump works in your environment? > > > I can't test it by myself since my hikey board seems to be broken now. > > > > With this I get a failure even earlier, even with 'acpi=off'. > > With this patch, on boot of the kdump kernel I get: > > I think you ran into the problem that I mentioned in: > http://lists.infradead.org/pipermail/linux-arm-kernel/2016-July/444500.html > > You may want to > - apply the change stated above, or > (Given that we don't know about the configuration of crash dump kernel, > checking for CONFIG_ZONE_DMA doesn't make sense. Instead, we'd better > always enforce ARCH_LOW_ADDRESS_LIMIT.) > - explicitly specify the start address (Y) below ARCH_LOW_ADDRESS_LIMIT > at "crashkernel=X@Y" > Either would work. Have these methods fixed your problem in the end? -Takahiro AKASHI > Thanks, > -Takahiro AKASHI > > > [ 0.000000] Linux version 4.7.0-rc4+ (morse@melchizedek) (gcc version 5.2.1 6 > > [ 0.000000] Boot CPU: AArch64 Processor [411fd071] > > [ 0.000000] earlycon: pl11 at MMIO 0x000000007ff80000 (options '') > > [ 0.000000] bootconsole [pl11] enabled > > [ 0.000000] debug: ignoring loglevel setting. > > [ 0.000000] efi: Getting EFI parameters from FDT: > > [ 0.000000] efi: EFI v2.50 by ARM Juno EFI Nov 24 2015 12:36:35 > > [ 0.000000] efi: ACPI=0xf95b0000 ACPI 2.0=0xf95b0014 PROP=0xfe8db4d8 > > [ 0.000000] Reserving 1KB of memory at 0x9fffff000 for elfcorehdr > > [ 0.000000] cma: Failed to reserve 16 MiB > > [ 0.000000] On node 0 totalpages: 132160 > > [ 0.000000] DMA zone: 17 pages used for memmap > > [ 0.000000] DMA zone: 0 pages reserved > > [ 0.000000] DMA zone: 1088 pages, LIFO batch:0 > > [ 0.000000] Normal zone: 2048 pages used for memmap > > [ 0.000000] Normal zone: 131072 pages, LIFO batch:31 > > [ 0.000000] bootmem alloc of 64 bytes failed! > > [ 0.000000] Kernel panic - not syncing: Out of memory > > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.7.0-rc4+ #4600 > > [ 0.000000] Hardware name: ARM Juno development board (r1) (DT) > > [ 0.000000] Call trace: > > [ 0.000000] [<ffff0000080889a8>] dump_backtrace+0x0/0x1e8 > > [ 0.000000] [<ffff000008088ba4>] show_stack+0x14/0x20 > > [ 0.000000] [<ffff000008363274>] dump_stack+0x94/0xb8 > > [ 0.000000] [<ffff00000816192c>] panic+0x10c/0x278 > > [ 0.000000] [<ffff000008b14980>] free_bootmem_late+0x0/0xa0 > > [ 0.000000] [<ffff000008b14e68>] __alloc_bootmem_low+0x2c/0x38 > > [ 0.000000] [<ffff000008b02954>] setup_arch+0x2e4/0x5ac > > [ 0.000000] [<ffff000008b00854>] start_kernel+0x70/0x390 > > [ 0.000000] [<ffff000008b001bc>] __primary_switched+0x30/0x6c > > [ 0.000000] ---[ end Kernel panic - not syncing: Out of memory > > > > > > Trying again, booted with: > > > console=ttyAMA0,115200 earlycon=pl011,0x7ff80000 root=/dev/nfs > > > nfsroot=10.X.X.X:/ubuntu-15.04-server-arm64,v3 resume=/dev/sda2 no_console_suspend > > > ip=dhcp rw crashkernel=512M stacktrace ignore_loglevel=1 acpi=off efi=debug > > memblock=debug > > > > kexec-tools invoked as: > > > kexec -x --reuse-cmdline --dtb=/sys/firmware/fdt -p /aarch64-Image > > > > cat /proc/iomem | grep Crash: > > > 9e0000000-9ffffffff : Crash kernel > > > > crash kernel memblock before call to memblock_cap_memory_range(): > > [ 0.000000] MEMBLOCK configuration: > > [ 0.000000] memory size = 0x1fef10000 reserved size = 0x4f3b > > [ 0.000000] memory.cnt = 0x9 > > [ 0.000000] memory[0x0] [0x00000080000000-0x000000dfffffff], 0x60000000 > > bytes flags: 0x0 > > [ 0.000000] memory[0x1] [0x000000e00f0000-0x000000f949ffff], 0x193b0000 > > bytes flags: 0x0 > > (uefi runtime code|data|acpi:) > > [ 0.000000] memory[0x2] [0x000000f94a0000-0x000000f984ffff], 0x3b0000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x3] [0x000000f9850000-0x000000fe81ffff], 0x4fd0000 > > bytes flags: 0x0 > > (uefi runtime data:) > > [ 0.000000] memory[0x4] [0x000000fe820000-0x000000fe85ffff], 0x40000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x5] [0x000000fe860000-0x000000fe86ffff], 0x10000 > > bytes flags: 0x0 > > (uefi runtime data:) > > [ 0.000000] memory[0x6] [0x000000fe870000-0x000000fe8bffff], 0x50000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x7] [0x000000fe8c0000-0x000000feffffff], 0x740000 > > bytes flags: 0x0 > > [ 0.000000] memory[0x8] [0x00000880000000-0x000009ffffffff], 0x180000000 > > bytes flags: 0x0 > > [ 0.000000] reserved.cnt = 0x2 > > (uefi memory map:) > > [ 0.000000] reserved[0x0] [0x000000f985a000-0x000000f985afff], 0x1000 > > bytes flags: 0x0 > > (device tree:) > > [ 0.000000] reserved[0x1] [0x000009e0ce0000-0x000009e0ce3f3a], 0x3f3b > > bytes flags: 0x0 > > > > crash kernel memblock after call to memblock_cap_memory_range(): > > [ 0.000000] MEMBLOCK configuration: > > [ 0.000000] memory size = 0x20440000 reserved size = 0x3f3b > > [ 0.000000] memory.cnt = 0x4 > > [ 0.000000] memory[0x0] [0x000000f94a0000-0x000000f984ffff], 0x3b0000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x1] [0x000000fe820000-0x000000fe85ffff], 0x40000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x2] [0x000000fe870000-0x000000fe8bffff], 0x50000 > > bytes flags: 0x4 > > [ 0.000000] memory[0x3] [0x000009e0000000-0x000009ffffffff], 0x20000000 > > bytes flags: 0x0 > > [ 0.000000] reserved.cnt = 0x1 > > [ 0.000000] reserved[0x0] [0x000009e0ce0000-0x000009e0ce3f3a], 0x3f3b > > bytes flags: 0x0 > > (reserve kernel text:) > > [ 0.000000] memblock_reserve: [0x000009e0080000-0x000009e0cd0fff] flags 0x0 > > arm64_memblock_init+0x1e0/0x40c > > (reserve elfcorehdr:) > > [ 0.000000] memblock_reserve: [0x000009fffff000-0x000009fffff3ff] flags 0x0 > > arm64_memblock_init+0x37c/0x40c > > [ 0.000000] Reserving 1KB of memory at 0x9fffff000 for elfcorehdr > > [ 0.000000] cma: Failed to reserve 16 MiB > > ... > > > > It looks like memblock_cap_memory_range() did exactly what you intended > > > > This first fault seems to be because memblock_start_of_DRAM() is being dragged > > down by the preserved nomap areas, this means there isn't any usable memory > > within ~4G of memblock_start_of_DRAM()... > > > > I will dig into the bootmem alloc failure next week... > > > > (let me know if you want the full boot logs... they are more noise than signal) > > > > > > Thanks, > > > > James > > > > > > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
===8<=== diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 4bd55cd..c027275 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -380,11 +380,8 @@ static void __init fdt_enforce_memory_region(void) of_scan_flat_dt(early_init_dt_scan_usablemem, ®); - if (reg.size) { - memblock_remove(0, PAGE_ALIGN(reg.base)); - memblock_remove(round_down(reg.base + reg.size, PAGE_SIZE), - ULLONG_MAX); - } + if (reg.size) + memblock_cap_memory_range(reg.base, reg.size); } void __init arm64_memblock_init(void) diff --git a/include/linux/memblock.h b/include/linux/memblock.h index 3106ac1..9ab17a9 100644 --- a/include/linux/memblock.h +++ b/include/linux/memblock.h @@ -333,6 +333,7 @@ phys_addr_t memblock_mem_size(unsigned long limit_pfn); phys_addr_t memblock_start_of_DRAM(void); phys_addr_t memblock_end_of_DRAM(void); void memblock_enforce_memory_limit(phys_addr_t memory_limit); +void memblock_cap_memory_range(phys_addr_t base, phys_addr_t size); bool memblock_is_memory(phys_addr_t addr); int memblock_is_map_memory(phys_addr_t addr); int memblock_is_region_memory(phys_addr_t base, phys_addr_t size); diff --git a/mm/memblock.c b/mm/memblock.c index ac12489..30badf1 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -1486,6 +1486,34 @@ void __init memblock_enforce_memory_limit(phys_addr_t limit) (phys_addr_t)ULLONG_MAX); } +void __init memblock_cap_memory_range(phys_addr_t base, phys_addr_t size) +{ + int start_rgn, end_rgn; + int i, ret; + + if (!size) + return; + + ret = memblock_isolate_range(&memblock.memory, base, size, + &start_rgn, &end_rgn); + if (ret) + return; + + /* remove all the MAP regions */ + for (i = memblock.memory.cnt - 1; i >= end_rgn; i--) + if (!memblock_is_nomap(&memblock.memory.regions[i])) + memblock_remove_region(&memblock.memory, i); + + for (i = start_rgn - 1; i >= 0; i--) + if (!memblock_is_nomap(&memblock.memory.regions[i])) + memblock_remove_region(&memblock.memory, i); + + /* truncate the reserved regions */ + memblock_remove_range(&memblock.reserved, 0, base); + memblock_remove_range(&memblock.reserved, + base + size, (phys_addr_t)ULLONG_MAX); +} + static int __init_memblock memblock_search(struct memblock_type *type, phys_addr_t addr) { unsigned int left = 0, right = type->cnt;