It's reported that kdump kernel failed to boot and can't dump vmcore
when crashkernel=192M and SME/SEV is active.
This is because swiotlb will be enabled and reserves 64M memory by
default on system with SME/SEV enabled. Then kdump kernel will be out of
memory after taking 64M away for swiotlb init.
So here add extra 64M memory to default crashkernel value so that kdump
kernel can function well as before. When doing that, search journalctl
for the "Memory Encryption Features active: AMD" to check if SME or SEV
is active. This line of log is printed out in kernel function as below
and the type SME is mutual exclusive with type SEV.
***:
arch/x86/mm/mem_encrypt.c:print_mem_encrypt_feature_info()
Note:
1) The conditional check is relying on journalctl log because I didn't
find available system interface to check if SEV is active. Even
though we can check if SME is active via /proc/cpuinfo. For
consistency, I take the same check for both SME and SEV by searching
journalctl.
2) The conditional check is relying on journalctl log, means it won't
work for crashkernel setting in anoconda because the installation
kernel doesn't have the SME/SEV setting. So customer need manually
run 'kdumpctl reset-crashkernel' to reset crashkernel to add the
extra 64M after OS installation.
3) We need watch the line of log printing in
print_mem_encrypt_feature_info() in kernel just in case people may
change it in the future.
Signed-off-by: Baoquan He <bhe(a)redhat.com>
---
kdump-lib.sh | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 16238c508f65..eadb57a1828b 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -84,6 +84,11 @@ is_generic_fence_kdump()
[[ $(kdump_get_conf_val fence_kdump_nodes) ]]
}
+is_sme_or_sev_active()
+{
+ journalctl -q --dmesg --grep "^Memory Encryption Features active: AMD
(SME|SEV)$"
+}
+
to_dev_name()
{
local dev="${1//\"/}"
@@ -930,7 +935,13 @@ kdump_get_arch_recommend_crashkernel()
_arch=$(uname -m)
- if [[ $_arch == "x86_64" ]] || [[ $_arch == "s390x" ]]; then
+ if [[ $_arch == "x86_64" ]] ; then
+ if is_sme_or_sev_active; then
+ _ck_cmdline="1G-4G:256M,4G-64G:320M,64G-:576M"
+ else
+ _ck_cmdline="1G-4G:192M,4G-64G:256M,64G-:512M"
+ fi
+ elif [[ $_arch == "s390x" ]]; then
_ck_cmdline="1G-4G:192M,4G-64G:256M,64G-:512M"
elif [[ $_arch == "aarch64" ]]; then
local _running_kernel
--
2.41.0