From: Pingfan Liu <piliu at redhat.com>
On aarch64, both 4K and 64K kernel can be installed, while they demand different size reserved memory for kdump kernel.
'get_conf PAGE_SIZE' can not work if installing a 64K kernel when running a 4K kernel. Hence resorting to the kernel release naming convention. At present, the 64K kernel has the keyword '64k' in its suffix.
The base line for 64K is decided based on 4K. The difference 100M is chosen because on a high end machine without smmu enabled, the difference of MemFree is 82M.
As for the smmu case, a significant memory consumption difference lies between 64k and 4k driver. And it should be calculated separatedly. (Implemented in later patch)
Signed-off-by: Pingfan Liu piliu@redhat.com To: kexec@lists.fedoraproject.org Cc: Coiby Xu coxu@redhat.com
--- kdump-lib.sh | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- kdumpctl | 22 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/kdump-lib.sh b/kdump-lib.sh index bc725c0..0869703 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -879,8 +879,41 @@ get_recommend_size() echo "0M" }
+ +kdump_get_aarch64_64k_crashkernel() +{ + # base line 4K + local _ck_cmdline="1G-4G:256M,4G-64G:320M,64G-:576M" + local _new_str="" + # Without smmu, the diff of MemFree between 4K and 64K measured on a high end aarch64 machine is 82M. + # Picking up 100M to cover this diff. And finally, we have "1G-4G:356M;4G-64G:420M;64G-:676M" + local _64k_delta="100" + + IFS=',' read -ra ADDR <<< "$_ck_cmdline" + for i in "${ADDR[@]}"; do + key=$(echo "$i" | cut -d':' -f 1) + value=$(echo "$i" | cut -d':' -f 2) + value=$(echo "$value" | tr -d 'M') + value=$((value + _64k_delta)) + _new_str+="${key}:${value}M," + done + _new_str=${_new_str::-1} + echo "$_new_str" +} + +kdump_get_aarch64_4k_crashkernel() +{ + # For 4KB page size, the formula is based on x86 plus extra = 64M + local _ck_cmdline="1G-4G:256M,4G-64G:320M,64G-:576M" + + echo $"_ck_cmdline" +} + # get default crashkernel # $1 dump mode, if not specified, dump_mode will be judged by is_fadump_capable +# $2 target-kernel, if not specified, got by 'uname -r' +# +# shellcheck disable=SC2120 kdump_get_arch_recommend_crashkernel() { local _arch _ck_cmdline _dump_mode @@ -900,8 +933,20 @@ kdump_get_arch_recommend_crashkernel() if [[ $_arch == "x86_64" ]] || [[ $_arch == "s390x" ]]; then _ck_cmdline="1G-4G:192M,4G-64G:256M,64G-:512M" elif [[ $_arch == "aarch64" ]]; then - # For 4KB page size, the formula is based on x86 plus extra = 64M - _ck_cmdline="1G-4G:256M,4G-64G:320M,64G-:576M" + local _target_kernel + + if [[ -z "$2" ]]; then + _target_kernel=$(uname -r) + else + _target_kernel=$2 + fi + + if echo "$_target_kernel" | grep -q 64k; then + # For 64KB page size + _ck_cmdline=$(kdump_get_aarch64_64k_crashkernel) + else + _ck_cmdline=$(kdump_get_aarch64_4k_crashkernel) + fi elif [[ $_arch == "ppc64le" ]]; then if [[ $_dump_mode == "fadump" ]]; then _ck_cmdline="4G-16G:768M,16G-64G:1G,64G-128G:2G,128G-1T:4G,1T-2T:6G,2T-4T:12G,4T-8T:20G,8T-16T:36G,16T-32T:64G,32T-64T:128G,64T-:180G" diff --git a/kdumpctl b/kdumpctl index 3eb2f73..395934a 100755 --- a/kdumpctl +++ b/kdumpctl @@ -1738,6 +1738,7 @@ reset_crashkernel_for_installed_kernel() { local _installed_kernel _running_kernel _crashkernel _crashkernel_running local _dump_mode_running _fadump_val_running + local _arch
# During package install, only try to reset crashkernel for osbuild # thus to avoid calling grubby when installing os via anaconda @@ -1766,6 +1767,27 @@ reset_crashkernel_for_installed_kernel() _dump_mode_running=$(get_dump_mode_by_kernel "$_running_kernel") _fadump_val_running=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
+ _arch=$(uname -m) + # On aarch64, there are 4K and 64K kernel, which demands different crashkernel value + if [[ $_arch == "aarch64" ]]; then + local _installed_64K=0 _running_64K=0 + + if echo "$_installed_kernel" | grep 64k; then + _installed_64K=1 + fi + if echo "$_running_kernel" | grep 64k; then + _running_64K=1 + fi + + # Otherwise, fall through to common case like other arches + if [[ $_installed_64K != "$_running_64K" ]]; then + # if the difference is 4K VS 64K + _crashkernel_running=$(kdump_get_arch_recommend_crashkernel "kdump" "$_installed_kernel") + _update_kernel_cmdline "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running" + return + fi + fi + if [[ $_crashkernel != "$_crashkernel_running" ]]; then if _update_kernel_cmdline "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running"; then echo "kexec-tools has reset $_installed_kernel to use the new default crashkernel value $_crashkernel_running"