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>
---
 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)

Reply via email to