On Fri, Jun 28, 2019 at 12:51:19AM +0530, Hari Bathini wrote: > Currently, if memory_limit is specified and it overlaps with memory to > be reserved for capture kernel, memory_limit is adjusted to accommodate > capture kernel. With memory reservation for capture kernel moved later > (after enforcing memory limit), this adjustment no longer holds water. > So, avoid adjusting memory_limit and error out instead.
The adjustment of memory limit does not look quite sound - There is no code to undo the adjustment in case reservation fails - I don't think reservation is still forced to the end of memory causing the kernel to use memory it was supposed not to - The CMA reservation again causes teh reserved memory to be used - Finally the CMA reservation makes this obsolete because the reserved memory is can be used by the system > > Signed-off-by: Hari Bathini <hbath...@linux.ibm.com> Reviewed-by: Michal Suchanek <msucha...@suse.de> > --- > arch/powerpc/kernel/fadump.c | 16 ---------------- > arch/powerpc/kernel/machine_kexec.c | 22 +++++++++++----------- > 2 files changed, 11 insertions(+), 27 deletions(-) > > diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c > index 4eab972..a784695 100644 > --- a/arch/powerpc/kernel/fadump.c > +++ b/arch/powerpc/kernel/fadump.c > @@ -476,22 +476,6 @@ int __init fadump_reserve_mem(void) > #endif > } > > - /* > - * Calculate the memory boundary. > - * If memory_limit is less than actual memory boundary then reserve > - * the memory for fadump beyond the memory_limit and adjust the > - * memory_limit accordingly, so that the running kernel can run with > - * specified memory_limit. > - */ > - if (memory_limit && memory_limit < memblock_end_of_DRAM()) { > - size = get_fadump_area_size(); > - if ((memory_limit + size) < memblock_end_of_DRAM()) > - memory_limit += size; > - else > - memory_limit = memblock_end_of_DRAM(); > - printk(KERN_INFO "Adjusted memory_limit for firmware-assisted" > - " dump, now %#016llx\n", memory_limit); > - } > if (memory_limit) > memory_boundary = memory_limit; > else > diff --git a/arch/powerpc/kernel/machine_kexec.c > b/arch/powerpc/kernel/machine_kexec.c > index c4ed328..fc5533b 100644 > --- a/arch/powerpc/kernel/machine_kexec.c > +++ b/arch/powerpc/kernel/machine_kexec.c > @@ -125,10 +125,8 @@ void __init reserve_crashkernel(void) > crashk_res.end = crash_base + crash_size - 1; > } > > - if (crashk_res.end == crashk_res.start) { > - crashk_res.start = crashk_res.end = 0; > - return; > - } > + if (crashk_res.end == crashk_res.start) > + goto error_out; > > /* We might have got these values via the command line or the > * device tree, either way sanitise them now. */ > @@ -170,15 +168,13 @@ void __init reserve_crashkernel(void) > if (overlaps_crashkernel(__pa(_stext), _end - _stext)) { > printk(KERN_WARNING > "Crash kernel can not overlap current kernel\n"); > - crashk_res.start = crashk_res.end = 0; > - return; > + goto error_out; > } > > /* Crash kernel trumps memory limit */ > if (memory_limit && memory_limit <= crashk_res.end) { > - memory_limit = crashk_res.end + 1; > - printk("Adjusted memory limit for crashkernel, now 0x%llx\n", > - memory_limit); > + pr_err("Crash kernel size can't exceed memory_limit\n"); > + goto error_out; > } > > printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " > @@ -190,9 +186,13 @@ void __init reserve_crashkernel(void) > if (!memblock_is_region_memory(crashk_res.start, crash_size) || > memblock_reserve(crashk_res.start, crash_size)) { > pr_err("Failed to reserve memory for crashkernel!\n"); > - crashk_res.start = crashk_res.end = 0; > - return; > + goto error_out; > } > + > + return; > +error_out: > + crashk_res.start = crashk_res.end = 0; > + return; > } > > int overlaps_crashkernel(unsigned long start, unsigned long size) >