aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2013-01-24 15:20:11 -0500
committerH. Peter Anvin <hpa@linux.intel.com>2013-01-29 22:32:58 -0500
commit0212f9159694be61c6bc52e925fa76643e0c1abf (patch)
tree21fff008e27df08d3ab650d9c2421b490fcdc926 /kernel
parent7d41a8a4a2b2438621a9159477bff36a11d79a42 (diff)
x86: Add Crash kernel low reservation
During kdump kernel's booting stage, it need to find low ram for swiotlb buffer when system does not support intel iommu/dmar remapping. kexed-tools is appending memmap=exactmap and range from /proc/iomem with "Crash kernel", and that range is above 4G for 64bit after boot protocol 2.12. We need to add another range in /proc/iomem like "Crash kernel low", so kexec-tools could find that info and append to kdump kernel command line. Try to reserve some under 4G if the normal "Crash kernel" is above 4G. User could specify the size with crashkernel_low=XX[KMG]. -v2: fix warning that is found by Fengguang's test robot. -v3: move out get_mem_size change to another patch, to solve compiling warning that is found by Borislav Petkov <bp@alien8.de> -v4: user must specify crashkernel_low if system does not support intel or amd iommu. Signed-off-by: Yinghai Lu <yinghai@kernel.org> Link: http://lkml.kernel.org/r/1359058816-7615-31-git-send-email-yinghai@kernel.org Cc: Eric Biederman <ebiederm@xmission.com> Cc: Rob Landley <rob@landley.net> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kexec.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c
index 5e4bd7864c5d..2436ffcec91f 100644
--- a/kernel/kexec.c
+++ b/kernel/kexec.c
@@ -54,6 +54,12 @@ struct resource crashk_res = {
54 .end = 0, 54 .end = 0,
55 .flags = IORESOURCE_BUSY | IORESOURCE_MEM 55 .flags = IORESOURCE_BUSY | IORESOURCE_MEM
56}; 56};
57struct resource crashk_low_res = {
58 .name = "Crash kernel low",
59 .start = 0,
60 .end = 0,
61 .flags = IORESOURCE_BUSY | IORESOURCE_MEM
62};
57 63
58int kexec_should_crash(struct task_struct *p) 64int kexec_should_crash(struct task_struct *p)
59{ 65{
@@ -1369,10 +1375,11 @@ static int __init parse_crashkernel_simple(char *cmdline,
1369 * That function is the entry point for command line parsing and should be 1375 * That function is the entry point for command line parsing and should be
1370 * called from the arch-specific code. 1376 * called from the arch-specific code.
1371 */ 1377 */
1372int __init parse_crashkernel(char *cmdline, 1378static int __init __parse_crashkernel(char *cmdline,
1373 unsigned long long system_ram, 1379 unsigned long long system_ram,
1374 unsigned long long *crash_size, 1380 unsigned long long *crash_size,
1375 unsigned long long *crash_base) 1381 unsigned long long *crash_base,
1382 const char *name)
1376{ 1383{
1377 char *p = cmdline, *ck_cmdline = NULL; 1384 char *p = cmdline, *ck_cmdline = NULL;
1378 char *first_colon, *first_space; 1385 char *first_colon, *first_space;
@@ -1382,16 +1389,16 @@ int __init parse_crashkernel(char *cmdline,
1382 *crash_base = 0; 1389 *crash_base = 0;
1383 1390
1384 /* find crashkernel and use the last one if there are more */ 1391 /* find crashkernel and use the last one if there are more */
1385 p = strstr(p, "crashkernel="); 1392 p = strstr(p, name);
1386 while (p) { 1393 while (p) {
1387 ck_cmdline = p; 1394 ck_cmdline = p;
1388 p = strstr(p+1, "crashkernel="); 1395 p = strstr(p+1, name);
1389 } 1396 }
1390 1397
1391 if (!ck_cmdline) 1398 if (!ck_cmdline)
1392 return -EINVAL; 1399 return -EINVAL;
1393 1400
1394 ck_cmdline += 12; /* strlen("crashkernel=") */ 1401 ck_cmdline += strlen(name);
1395 1402
1396 /* 1403 /*
1397 * if the commandline contains a ':', then that's the extended 1404 * if the commandline contains a ':', then that's the extended
@@ -1409,6 +1416,23 @@ int __init parse_crashkernel(char *cmdline,
1409 return 0; 1416 return 0;
1410} 1417}
1411 1418
1419int __init parse_crashkernel(char *cmdline,
1420 unsigned long long system_ram,
1421 unsigned long long *crash_size,
1422 unsigned long long *crash_base)
1423{
1424 return __parse_crashkernel(cmdline, system_ram, crash_size, crash_base,
1425 "crashkernel=");
1426}
1427
1428int __init parse_crashkernel_low(char *cmdline,
1429 unsigned long long system_ram,
1430 unsigned long long *crash_size,
1431 unsigned long long *crash_base)
1432{
1433 return __parse_crashkernel(cmdline, system_ram, crash_size, crash_base,
1434 "crashkernel_low=");
1435}
1412 1436
1413static void update_vmcoreinfo_note(void) 1437static void update_vmcoreinfo_note(void)
1414{ 1438{