From: Hari Bathini <hbath...@linux.ibm.com> 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.
Signed-off-by: Hari Bathini <hbath...@linux.ibm.com> Reviewed-by: Michal Suchanek <msucha...@suse.de> --- arch/powerpc/kernel/fadump.c | 16 ---------------- arch/powerpc/kexec/core.c | 22 +++++++++++----------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index ff0114aeba9b..54d56ecadf1a 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -472,22 +472,6 @@ int __init fadump_reserve_mem(void) } } - /* - * 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) mem_boundary = memory_limit; else diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c index 078fe3d76feb..491e08d98c1b 100644 --- a/arch/powerpc/kexec/core.c +++ b/arch/powerpc/kexec/core.c @@ -126,10 +126,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. */ @@ -171,15 +169,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 " @@ -191,9 +187,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) -- 2.23.0