|
@@ -493,7 +493,7 @@ static void __init memblock_x86_reserve_range_setup_data(void)
|
|
|
# define CRASH_KERNEL_ADDR_HIGH_MAX MAXMEM
|
|
|
#endif
|
|
|
|
|
|
-static void __init reserve_crashkernel_low(void)
|
|
|
+static int __init reserve_crashkernel_low(void)
|
|
|
{
|
|
|
#ifdef CONFIG_X86_64
|
|
|
const unsigned long long alignment = 16<<20; /* 16M */
|
|
@@ -522,17 +522,16 @@ static void __init reserve_crashkernel_low(void)
|
|
|
} else {
|
|
|
/* passed with crashkernel=0,low ? */
|
|
|
if (!low_size)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
low_base = memblock_find_in_range(low_size, (1ULL<<32),
|
|
|
low_size, alignment);
|
|
|
|
|
|
if (!low_base) {
|
|
|
- if (!auto_set)
|
|
|
- pr_info("crashkernel low reservation failed - No suitable area found.\n");
|
|
|
-
|
|
|
- return;
|
|
|
+ pr_err("Cannot reserve %ldMB crashkernel low memory, please try smaller size.\n",
|
|
|
+ (unsigned long)(low_size >> 20));
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
memblock_reserve(low_base, low_size);
|
|
@@ -544,6 +543,7 @@ static void __init reserve_crashkernel_low(void)
|
|
|
crashk_low_res.end = low_base + low_size - 1;
|
|
|
insert_resource(&iomem_resource, &crashk_low_res);
|
|
|
#endif
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void __init reserve_crashkernel(void)
|
|
@@ -595,6 +595,11 @@ static void __init reserve_crashkernel(void)
|
|
|
}
|
|
|
memblock_reserve(crash_base, crash_size);
|
|
|
|
|
|
+ if (crash_base >= (1ULL << 32) && reserve_crashkernel_low()) {
|
|
|
+ memblock_free(crash_base, crash_size);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
|
|
"for crashkernel (System RAM: %ldMB)\n",
|
|
|
(unsigned long)(crash_size >> 20),
|
|
@@ -604,9 +609,6 @@ static void __init reserve_crashkernel(void)
|
|
|
crashk_res.start = crash_base;
|
|
|
crashk_res.end = crash_base + crash_size - 1;
|
|
|
insert_resource(&iomem_resource, &crashk_res);
|
|
|
-
|
|
|
- if (crash_base >= (1ULL<<32))
|
|
|
- reserve_crashkernel_low();
|
|
|
}
|
|
|
#else
|
|
|
static void __init reserve_crashkernel(void)
|