diff --git a/kdump-lib.sh b/kdump-lib.sh index 7c1e3bc..a8c5ca5 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -1135,6 +1135,39 @@ _crashkernel_add() echo "${ret%,}" } +# Parses the kdump or fadump command line to extract a valid +# positive nr_cpus= value, defaulting to 1 if none is found. +find_nr_cpus() +{ + local _cmdline_append + local _nr_cpus=1 + + # shellcheck disable=SC2153 + if [[ $DEFAULT_DUMP_MODE == "fadump" ]]; then + _cmdline_append=$(grep '^\s*FADUMP_COMMANDLINE_APPEND\s*=' /etc/sysconfig/kdump | \ + sed 's/^\s*FADUMP_COMMANDLINE_APPEND\s*=\s*"\(.*\)".*$/\1/') + + else + _cmdline_append=$(grep '^\s*KDUMP_COMMANDLINE_APPEND\s*=' /etc/sysconfig/kdump | \ + sed 's/^\s*KDUMP_COMMANDLINE_APPEND\s*=\s*"\(.*\)".*$/\1/') + fi + + for arg in $_cmdline_append; do + case $arg in + nr_cpus=[0-9]*) + # Only accept if it's strictly digits after '=' + value=${arg#nr_cpus=} + if [[ $value =~ ^[1-9][0-9]*$ ]]; then + _nr_cpus=$value + fi + ;; + esac + done + + ddebug "Configured nr_cpus=$_nr_cpus" + echo "$_nr_cpus" +} + # get default crashkernel # $1 dump mode, if not specified, dump_mode will be judged by is_fadump_capable # $2 kernel-release, if not specified, got by _get_kdump_kernel_version @@ -1184,6 +1217,14 @@ kdump_get_arch_recommend_crashkernel() has_mlx5 && ((_delta += 150)) fi elif [[ $_arch == "ppc64le" ]]; then + local _per_cpu_area + local _nr_cpus + + # 1MB per CPU + _per_cpu_area=1 + _nr_cpus=$(find_nr_cpus) + + _delta=$((_delta + _per_cpu_area * _nr_cpus)) 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" else