[PATCH v31 09/12] arm64: kdump: provide /proc/vmcore file
From: AKASHI Takahiro <hidden>
Date: 2017-02-02 06:24:09
Also in:
kexec
On Wed, Feb 01, 2017 at 07:21:22PM +0000, Mark Rutland wrote:
On Wed, Feb 01, 2017 at 09:46:28PM +0900, AKASHI Takahiro wrote:quoted
Add arch-specific functions to provide a dump file, /proc/vmcore. This file is in ELF format and its ELF header needs to be prepared by userspace tools, like kexec-tools, in adance. The primary kernel is responsible to allocate the region with reserve_elfcorehdr() at boot time and advertize its location to crash dump kernel via a new device-tree property, "linux,elfcorehdr".quoted
+static int __init early_init_dt_scan_elfcorehdr(unsigned long node, + const char *uname, int depth, void *data) +{ + const __be32 *reg; + int len; + + if (depth != 1 || strcmp(uname, "chosen") != 0) + return 0; + + reg = of_get_flat_dt_prop(node, "linux,elfcorehdr", &len); + if (!reg || (len < (dt_root_addr_cells + dt_root_size_cells))) + return 1; + + elfcorehdr_addr = dt_mem_next_cell(dt_root_addr_cells, ®); + elfcorehdr_size = dt_mem_next_cell(dt_root_size_cells, ®); + + return 1; +} + +/* + * reserve_elfcorehdr() - reserves memory for elf core header + * + * This function reserves elf core header given in "elfcorehdr=" kernel + * command line parameter. This region contains all the information about + * primary kernel's core image and is used by a dump capture kernel to + * access the system memory on primary kernel. + */ +static void __init reserve_elfcorehdr(void) +{ + of_scan_flat_dt(early_init_dt_scan_elfcorehdr, NULL); + + if (!elfcorehdr_size) + return; + + if (memblock_is_region_reserved(elfcorehdr_addr, elfcorehdr_size)) { + pr_warn("elfcorehdr is overlapped\n"); + return; + } + + memblock_reserve(elfcorehdr_addr, elfcorehdr_size); + + pr_info("Reserving %lldKB of memory at 0x%llx for elfcorehdr\n", + elfcorehdr_size >> 10, elfcorehdr_addr); +}This doesn't seem right to me. The logic here doesn't match the commit message, the comment above reserve_elfcorehdr() doesn't match the implementation, and this doesn't match my understanding of how this was intended to be used from the DT binding.
Surely the commit message was wrong/misleading; It should say ===8<=== Arch-specific functions are added to allow for implementing a crash dump file interface, /proc/vmcore, which can be viewed as a ELF file. A user space tool, like kexec-tools, is responsible for allocating a separate region for the core's ELF header within crash kdump kernel memory and filling it in when executing kexec_load(). Then, its location will be advertised to crash dump kernel via a new device-tree property, "linux,elfcorehdr", and crash dump kernel preserves the region for later use with reserve_elfcorehdr()@boot time. On crash dump kernel, /proc/vmcore will access the primary kernel's memory with copy_oldmem_page(), which feeds the data page-by-page by ioremap'ing it since it does not reside in linear mapping on crash dump kernel. Meanwhile, elfcorehdr_read() is simple as the region is always mapped. ===>8=== Does this make things clear?
I had assumed that we'd treat this in much the same way as the linux,reserved-memory-region property, with the primary kernel either dynamically allocating the region or using a command line option, and the base being exposed to userspace via /sys/ or /proc/ somehow.
I didn't get the point here, but please note that the data in ELF core header is produced by kexec-tools (who knows its location, too), and consumed solely by the crash dump kernel. Thanks, -Takahiro AKASHI
Why is that not the case? Thanks, Mark.