diff options
author | Yinghai Lu <yinghai@kernel.org> | 2013-01-24 15:20:11 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2013-01-29 22:32:58 -0500 |
commit | 0212f9159694be61c6bc52e925fa76643e0c1abf (patch) | |
tree | 21fff008e27df08d3ab650d9c2421b490fcdc926 /kernel | |
parent | 7d41a8a4a2b2438621a9159477bff36a11d79a42 (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.c | 34 |
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 | }; |
57 | struct resource crashk_low_res = { | ||
58 | .name = "Crash kernel low", | ||
59 | .start = 0, | ||
60 | .end = 0, | ||
61 | .flags = IORESOURCE_BUSY | IORESOURCE_MEM | ||
62 | }; | ||
57 | 63 | ||
58 | int kexec_should_crash(struct task_struct *p) | 64 | int 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 | */ |
1372 | int __init parse_crashkernel(char *cmdline, | 1378 | static 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 | ||
1419 | int __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 | |||
1428 | int __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 | ||
1413 | static void update_vmcoreinfo_note(void) | 1437 | static void update_vmcoreinfo_note(void) |
1414 | { | 1438 | { |