]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc64: add and call reserve_crashkernel
authorDave Kleikamp <dave.kleikamp@oracle.com>
Fri, 23 May 2014 21:39:00 +0000 (16:39 -0500)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Mon, 18 Apr 2016 16:42:48 +0000 (11:42 -0500)
original patch by Bob Picco

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Cc: Bob Picco <bob.picco@oracle.com>
arch/sparc/mm/init_64.c

index 3261a7ee9db957b7517d1e928b41e9d62acb503c..cab7cbdfb67e570195c33aca27f1a4af2785fa35 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/memblock.h>
 #include <linux/mmzone.h>
 #include <linux/gfp.h>
+#include <linux/kexec.h>
 
 #include <asm/head.h>
 #include <asm/page.h>
@@ -792,6 +793,51 @@ static void __init find_ramdisk(unsigned long phys_base)
 #endif
 }
 
+static void __init reserve_crashkernel(void)
+{
+#ifdef CONFIG_KEXEC
+       unsigned long total_mem;
+       unsigned long long crash_size, crash_base;
+       unsigned long long alignment = REAL_HPAGE_SIZE;
+       int ret;
+
+       total_mem = memblock_phys_mem_size();
+
+       ret = parse_crashkernel(boot_command_line, total_mem,
+               &crash_size, &crash_base);
+
+       if (ret)
+               return;
+
+       if (crash_base <= 0)
+               crash_base = memblock_find_in_range(alignment, ULLONG_MAX,
+                       crash_size, alignment);
+       else {
+               unsigned long start;
+
+               start = memblock_find_in_range(crash_base,
+                       crash_base + crash_size, crash_size, alignment);
+               crash_base = start;
+       }
+
+       if (!crash_base) {
+               pr_err("crashkernel reservation failed.\n");
+               return;
+       }
+
+       memblock_reserve(crash_base, crash_size);
+
+       pr_info("Reserving %ldMB of memory at %ldMB for crashkernel (System RAM: %ldMB)\n",
+               (unsigned long) (crash_size >> 20),
+               (unsigned long) (crash_base >> 20),
+               (unsigned long) (total_mem >> 20));
+
+       crashk_res.start = crash_base;
+       crashk_res.end = crash_base + crash_size - 1;
+       insert_resource(&iomem_resource, &crashk_res);
+#endif
+}
+
 struct node_mem_mask {
        unsigned long mask;
        unsigned long val;
@@ -2180,6 +2226,8 @@ void __init paging_init(void)
 
        find_ramdisk(phys_base);
 
+       reserve_crashkernel();
+
        if (cmdline_memory_size)
                reduce_memory(cmdline_memory_size);