|
Pablo Greco |
ceb317 |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
Pablo Greco |
ceb317 |
From: Dave Young <dyoung@redhat.com>
|
|
Pablo Greco |
ceb317 |
Date: Mon, 4 Jun 2018 01:38:25 -0400
|
|
Pablo Greco |
ceb317 |
Subject: [PATCH] kdump: round up the total memory size to 128M for crashkernel
|
|
Pablo Greco |
ceb317 |
reservation
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
Message-id: <20180604013831.523644967@redhat.com>
|
|
Pablo Greco |
ceb317 |
Patchwork-id: 8165
|
|
Pablo Greco |
ceb317 |
O-Subject: [kernel team] [PATCH RHEL8.0 V2 1/2] kdump: round up the total memory size to 128M for crashkernel reservation
|
|
Pablo Greco |
ceb317 |
Bugzilla: 1507353
|
|
Pablo Greco |
ceb317 |
RH-Acked-by: Don Zickus <dzickus@redhat.com>
|
|
Pablo Greco |
ceb317 |
RH-Acked-by: Baoquan He <bhe@redhat.com>
|
|
Pablo Greco |
ceb317 |
RH-Acked-by: Pingfan Liu <piliu@redhat.com>
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1507353
|
|
Pablo Greco |
ceb317 |
Build: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16534135
|
|
Pablo Greco |
ceb317 |
Tested: ppc64le, x86_64 with several memory sizes.
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
The total memory size we get in kernel is usually slightly less than 2G with
|
|
Pablo Greco |
ceb317 |
2G memory module machine. The main reason is bios/firmware reserve some area
|
|
Pablo Greco |
ceb317 |
it will not export all memory as usable to Linux.
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
2G memory X86 kvm guest test result of the total_mem value:
|
|
Pablo Greco |
ceb317 |
UEFI boot with ovmf: 0x7ef10000
|
|
Pablo Greco |
ceb317 |
Legacy boot kvm guest: 0x7ff7cc00
|
|
Pablo Greco |
ceb317 |
This is also a problem on arm64 UEFI booted system according to my test.
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
Thus for example crashkernel=1G-2G:128M, if we have a 1G memory
|
|
Pablo Greco |
ceb317 |
machine, we get total size 1023M from firmware then it will not fall
|
|
Pablo Greco |
ceb317 |
into 1G-2G thus no memory reserved. User will never know that, it is
|
|
Pablo Greco |
ceb317 |
hard to let user to know the exact total value we get in kernel
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
An option is to use dmi/smbios to get physical memory size, but it's not
|
|
Pablo Greco |
ceb317 |
reliable as well. According to Prarit hardware vendors sometimes screw this up.
|
|
Pablo Greco |
ceb317 |
Thus round up total size to 128M to workaround this problem.
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
Posted below patch in upstream, but no response yet:
|
|
Pablo Greco |
ceb317 |
http://lists.infradead.org/pipermail/kexec/2018-April/020568.html
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
Upstream Status: RHEL only
|
|
Pablo Greco |
ceb317 |
Signed-off-by: Dave Young <dyoung@redhat.com>
|
|
Pablo Greco |
ceb317 |
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|
Pablo Greco |
ceb317 |
---
|
|
Pablo Greco |
ceb317 |
kernel/crash_core.c | 14 ++++++++++++--
|
|
Pablo Greco |
ceb317 |
1 file changed, 12 insertions(+), 2 deletions(-)
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
|
|
Pablo Greco |
ceb317 |
index 18175687133a..e4dfe2a05a31 100644
|
|
Pablo Greco |
ceb317 |
--- a/kernel/crash_core.c
|
|
Pablo Greco |
ceb317 |
+++ b/kernel/crash_core.c
|
|
Pablo Greco |
ceb317 |
@@ -7,6 +7,7 @@
|
|
Pablo Greco |
ceb317 |
#include <linux/crash_core.h>
|
|
Pablo Greco |
ceb317 |
#include <linux/utsname.h>
|
|
Pablo Greco |
ceb317 |
#include <linux/vmalloc.h>
|
|
Pablo Greco |
ceb317 |
+#include <linux/sizes.h>
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
#include <asm/page.h>
|
|
Pablo Greco |
ceb317 |
#include <asm/sections.h>
|
|
Pablo Greco |
ceb317 |
@@ -39,6 +40,15 @@ static int __init parse_crashkernel_mem(char *cmdline,
|
|
Pablo Greco |
ceb317 |
unsigned long long *crash_base)
|
|
Pablo Greco |
ceb317 |
{
|
|
Pablo Greco |
ceb317 |
char *cur = cmdline, *tmp;
|
|
Pablo Greco |
ceb317 |
+ unsigned long long total_mem = system_ram;
|
|
Pablo Greco |
ceb317 |
+
|
|
Pablo Greco |
ceb317 |
+ /*
|
|
Pablo Greco |
ceb317 |
+ * Firmware sometimes reserves some memory regions for it's own use.
|
|
Pablo Greco |
ceb317 |
+ * so we get less than actual system memory size.
|
|
Pablo Greco |
ceb317 |
+ * Workaround this by round up the total size to 128M which is
|
|
Pablo Greco |
ceb317 |
+ * enough for most test cases.
|
|
Pablo Greco |
ceb317 |
+ */
|
|
Pablo Greco |
ceb317 |
+ total_mem = roundup(total_mem, SZ_128M);
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
/* for each entry of the comma-separated list */
|
|
Pablo Greco |
ceb317 |
do {
|
|
Pablo Greco |
ceb317 |
@@ -83,13 +93,13 @@ static int __init parse_crashkernel_mem(char *cmdline,
|
|
Pablo Greco |
ceb317 |
return -EINVAL;
|
|
Pablo Greco |
ceb317 |
}
|
|
Pablo Greco |
ceb317 |
cur = tmp;
|
|
Pablo Greco |
ceb317 |
- if (size >= system_ram) {
|
|
Pablo Greco |
ceb317 |
+ if (size >= total_mem) {
|
|
Pablo Greco |
ceb317 |
pr_warn("crashkernel: invalid size\n");
|
|
Pablo Greco |
ceb317 |
return -EINVAL;
|
|
Pablo Greco |
ceb317 |
}
|
|
Pablo Greco |
ceb317 |
|
|
Pablo Greco |
ceb317 |
/* match ? */
|
|
Pablo Greco |
ceb317 |
- if (system_ram >= start && system_ram < end) {
|
|
Pablo Greco |
ceb317 |
+ if (total_mem >= start && total_mem < end) {
|
|
Pablo Greco |
ceb317 |
*crash_size = size;
|
|
Pablo Greco |
ceb317 |
break;
|
|
Pablo Greco |
ceb317 |
}
|
|
Pablo Greco |
ceb317 |
--
|
|
Pablo Greco |
ceb317 |
2.28.0
|
|
Pablo Greco |
ceb317 |
|