On 04/07/16 at 10:03pm, Russell King wrote: > When the kernel crashkernel parameter is specified with just a size, we > are supposed to allocate a region from RAM to store the crashkernel. > However, ARM merely reserves physical address zero with no checking that > there is even RAM there. > > Fix this by lifting similar code from x86, importing it to ARM with the > ARM specific parameters added. In the absence of any platform specific > information, we allocate the crashkernel region from the first 512MB of > physical memory. > > Update the kdump documentation to reflect this change. > > Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk> > --- > Documentation/kdump/kdump.txt | 13 +++---------- > arch/arm/kernel/setup.c | 29 +++++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+), 10 deletions(-) > > diff --git a/Documentation/kdump/kdump.txt b/Documentation/kdump/kdump.txt > index bc4bd5a44b88..88ff63d5fde3 100644 > --- a/Documentation/kdump/kdump.txt > +++ b/Documentation/kdump/kdump.txt > @@ -263,12 +263,6 @@ been removed from the machine. > crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset] > range=start-[end] > > -Please note, on arm, the offset is required. > - crashkernel=<range1>:<size1>[,<range2>:<size2>,...]@offset > - range=start-[end] > - > - 'start' is inclusive and 'end' is exclusive. > - > For example: > > crashkernel=512M-2G:64M,2G-:128M > @@ -307,10 +301,9 @@ Boot into System Kernel > on the memory consumption of the kdump system. In general this is not > dependent on the memory size of the production system. > > - On arm, use "crashkernel=Y at X". Note that the start address of the kernel > - will be aligned to 128MiB (0x08000000), so if the start address is not then > - any space below the alignment point may be overwritten by the dump-capture kernel, > - which means it is possible that the vmcore is not that precise as expected. > + On arm, the use of "crashkernel=Y at X" is no longer necessary; the > + kernel will automatically locate the crash kernel image within the > + first 512MB of RAM if X is not given. > > > Load the Dump-capture Kernel > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c > index 139791ed473d..77b54c461c52 100644 > --- a/arch/arm/kernel/setup.c > +++ b/arch/arm/kernel/setup.c > @@ -938,6 +938,13 @@ static int __init init_machine_late(void) > late_initcall(init_machine_late); > > #ifdef CONFIG_KEXEC > +/* > + * The crash region must be aligned to 128MB to avoid > + * zImage relocating below the reserved region. > + */ > +#define CRASH_ALIGN (128 << 20) > +#define CRASH_ADDR_MAX (PHYS_OFFSET + (512 << 20)) > + > static inline unsigned long long get_total_mem(void) > { > unsigned long total; > @@ -965,6 +972,28 @@ static void __init reserve_crashkernel(void) > if (ret) > return; > > + if (crash_base <= 0) { > + unsigned long long crash_max = CRASH_ADDR_MAX; > + if (crash_max > (u32)~0) > + crash_max = (u32)~0; > + crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max, > + crash_size, CRASH_ALIGN); > + if (!crash_base) { > + pr_err("crashkernel reservation failed - No suitable area found.\n"); > + return; > + } > + } else { > + unsigned long long start; > + > + start = memblock_find_in_range(crash_base, > + crash_base + crash_size, > + crash_size, SECTION_SIZE); > + if (start != crash_base) { > + pr_err("crashkernel reservation failed - memory is in use.\n"); > + return; > + } > + } > + > ret = memblock_reserve(crash_base, crash_size); > if (ret < 0) { > pr_warn("crashkernel reservation failed - memory is in use (0x%lx)\n", Reviewed-by: Dave Young <dyoung at redhat.com> Thanks Dave