From 4f702c81e9d14a90d22d6b587de37733d0126960 Mon Sep 17 00:00:00 2001 From: Coiby Xu Date: Thu, 12 May 2022 10:48:31 +0800 Subject: [PATCH] improve get_recommend_size This patch rewrites get_recommend_size to get rid of the following limitations, 1. only supports ranges in crashkernel sorted in increasing order 2. the first entry of crashkernel should have only a single digit and it's in gigabytes Suggested-by: Philipp Rudo Signed-off-by: Coiby Xu Reviewed-by: Philipp Rudo --- kdump-lib.sh | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/kdump-lib.sh b/kdump-lib.sh index ed28df3..b137c89 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -796,33 +796,40 @@ get_system_size() echo $(( (sum) / 1024 / 1024 / 1024)) } +# Return the recommended size for the reserved crashkernel memory +# depending on the system memory size. +# +# This functions is expected to be consistent with the parse_crashkernel_mem() +# in kernel i.e. how kernel allocates the kdump memory given the crashkernel +# parameter crashkernel=range1:size1[,range2:size2,…] and the system memory +# size. get_recommend_size() { local mem_size=$1 local _ck_cmdline=$2 - local OLDIFS="$IFS" + local range start start_unit end end_unit size - start=${_ck_cmdline::1} - if [[ $mem_size -lt $start ]]; then - echo "0M" - return - fi - IFS=',' - for i in $_ck_cmdline; do - end=$(echo "$i" | awk -F "-" '{ print $2 }' | awk -F ":" '{ print $1 }') - recommend=$(echo "$i" | awk -F "-" '{ print $2 }' | awk -F ":" '{ print $2 }') - size=${end::-1} - unit=${end: -1} - if [[ $unit == 'T' ]]; then - size=$((size * 1024)) - fi - if [[ $mem_size -lt $size ]]; then - echo "$recommend" - IFS="$OLDIFS" + while read -r -d , range; do + # need to use non-default IFS as double spaces are used as a + # single delimiter while commas aren't... + IFS=, read start start_unit end end_unit size <<< \ + "$(echo "$range" | sed -n "s/\([0-9]\+\)\([GT]\?\)-\([0-9]*\)\([GT]\?\):\([0-9]\+[MG]\)/\1,\2,\3,\4,\5/p")" + + # aka. 102400T + end=${end:-104857600} + [[ "$end_unit" == T ]] && end=$((end * 1024)) + [[ "$start_unit" == T ]] && start=$((start * 1024)) + + if [[ $mem_size -ge $start ]] && [[ $mem_size -lt $end ]]; then + echo "$size" return fi - done - IFS="$OLDIFS" + + # append a ',' as read expects the 'file' to end with a delimiter + done <<< "$_ck_cmdline," + + # no matching range found + echo "0M" } # get default crashkernel