Re: [PATCH] selftests: fix memory-hotplug test
From: Shuah Khan
Date: Fri Jun 23 2017 - 12:03:31 EST
Hi Po-Hsu Lin,
On 06/18/2017 09:04 PM, Po-Hsu Lin wrote:
Please split the typo correction and fixes. Please send a patch
for each individual fix. I am seeing several fixes bundled in this
one single patch.
> Typo correction for hotpluggable_offline_memory() function> Check for hot-pluggable memory availability in prerequisite().
> Check for precentage range for -r flag>
> Fix the memory offline test, the $ratio was used with RANDOM as the
> possibility to get it offlined, correct it to become the portion of
> available removable memory blocks.
> Also ask the tool to try to offline the next available memory block
> if the attempt is unsuccessful. It will only fail if all removable
> memory blocks are busy.
>
> An nice example:
> PHLin@Latitude:~$ sudo ./test.sh
Remove the user info from this output. Same comment for the rest if
this output.
> Test scope: 10% hotplug memory
> online all hot-pluggable memory in offline state:
> SKIPPED - no hot-pluggable memory in offline state
> offline 10% hot-pluggable memory in online state
> trying to offline 3 out of 28 memory block(s):
> online->offline memory1
> online->offline memory10
> ./test.sh: line 74: echo: write error: Resource temporarily unavailable
> offline_memory_expect_success 10: unexpected fail
> online->offline memory100
> online->offline memory101
> online all hot-pluggable memory in offline state:
> offline->online memory1
> offline->online memory100
> offline->online memory101
> skip extra tests: debugfs is not mounted
> PHLin@Latitude:~$ echo $?
> 0
>
> Signed-off-by: Po-Hsu Lin <po-hsu.lin@xxxxxxxxxxxxx>
thanks,
-- Shuah
> ---
> .../selftests/memory-hotplug/mem-on-off-test.sh | 86 +++++++++++++++-----
> 1 file changed, 67 insertions(+), 19 deletions(-)
>
> diff --git a/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh b/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh
> index 6cddde0..f1603e6 100755
> --- a/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh
> +++ b/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh
> @@ -22,6 +22,11 @@ prerequisite()
> echo $msg memory hotplug is not supported >&2
> exit 0
> fi
> +
> + if ! grep -q 1 $SYSFS/devices/system/memory/memory*/removable; then
> + echo $msg no hot-pluggable memory >&2
> + exit 0
> + fi
> }
>
> #
> @@ -39,7 +44,7 @@ hotpluggable_memory()
> done
> }
>
> -hotplaggable_offline_memory()
> +hotpluggable_offline_memory()
> {
> hotpluggable_memory offline
> }
> @@ -75,9 +80,12 @@ online_memory_expect_success()
>
> if ! online_memory $memory; then
> echo $FUNCNAME $memory: unexpected fail >&2
> + return 1
> elif ! memory_is_online $memory; then
> echo $FUNCNAME $memory: unexpected offline >&2
> + return 1
> fi
> + return 0
> }
>
> online_memory_expect_fail()
> @@ -86,9 +94,12 @@ online_memory_expect_fail()
>
> if online_memory $memory 2> /dev/null; then
> echo $FUNCNAME $memory: unexpected success >&2
> + return 1
> elif ! memory_is_offline $memory; then
> echo $FUNCNAME $memory: unexpected online >&2
> + return 1
> fi
> + return 0
> }
>
> offline_memory_expect_success()
> @@ -97,9 +108,12 @@ offline_memory_expect_success()
>
> if ! offline_memory $memory; then
> echo $FUNCNAME $memory: unexpected fail >&2
> + return 1
> elif ! memory_is_offline $memory; then
> echo $FUNCNAME $memory: unexpected offline >&2
> + return 1
> fi
> + return 0
> }
>
> offline_memory_expect_fail()
> @@ -108,14 +122,18 @@ offline_memory_expect_fail()
>
> if offline_memory $memory 2> /dev/null; then
> echo $FUNCNAME $memory: unexpected success >&2
> + return 1
> elif ! memory_is_online $memory; then
> echo $FUNCNAME $memory: unexpected offline >&2
> + return 1
> fi
> + return 0
> }
>
> error=-12
> priority=0
> ratio=10
> +retval=0
>
> while getopts e:hp:r: opt; do
> case $opt in
> @@ -131,6 +149,10 @@ while getopts e:hp:r: opt; do
> ;;
> r)
> ratio=$OPTARG
> + if [ "$ratio" -gt 100 ] || [ "$ratio" -lt 0 ]; then
> + echo "The percentage should be an integer within 0~100 range"
> + exit
> + fi
> ;;
> esac
> done
> @@ -143,35 +165,58 @@ fi
> prerequisite
>
> echo "Test scope: $ratio% hotplug memory"
> -echo -e "\t online all hotplug memory in offline state"
> -echo -e "\t offline $ratio% hotplug memory in online state"
> -echo -e "\t online all hotplug memory in offline state"
>
> #
> # Online all hot-pluggable memory
> #
> -for memory in `hotplaggable_offline_memory`; do
> - echo offline-online $memory
> - online_memory_expect_success $memory
> -done
> +hotpluggable_num=`hotpluggable_offline_memory | wc -l`
> +echo -e "\t online all hot-pluggable memory in offline state:"
> +if [ "$hotpluggable_num" -gt 0 ]; then
> + for memory in `hotpluggable_offline_memory`; do
> + echo "offline->online memory$memory"
> + if ! online_memory_expect_success $memory; then
> + retval=1
> + fi
> + done
> +else
> + echo -e "\t\t SKIPPED - no hot-pluggable memory in offline state"
> +fi
>
> #
> # Offline $ratio percent of hot-pluggable memory
> #
> +hotpluggable_num=`hotpluggable_online_memory | wc -l`
> +target=`echo "a=$hotpluggable_num*$ratio; if ( a%100 ) a/100+1 else a/100" | bc`
> +echo -e "\t offline $ratio% hot-pluggable memory in online state"
> +echo -e "\t trying to offline $target out of $hotpluggable_num memory block(s):"
> for memory in `hotpluggable_online_memory`; do
> - if [ $((RANDOM % 100)) -lt $ratio ]; then
> - echo online-offline $memory
> - offline_memory_expect_success $memory
> + if [ "$target" -gt 0 ]; then
> + echo "online->offline memory$memory"
> + if offline_memory_expect_success $memory; then
> + target=$(($target - 1))
> + fi
> fi
> done
> +if [ "$target" -gt 0 ]; then
> + retval=1
> + echo -e "\t\t FAILED - unable to offline some memory blocks, device busy?"
> +fi
>
> #
> # Online all hot-pluggable memory again
> #
> -for memory in `hotplaggable_offline_memory`; do
> - echo offline-online $memory
> - online_memory_expect_success $memory
> -done
> +hotpluggable_num=`hotpluggable_offline_memory | wc -l`
> +echo -e "\t online all hot-pluggable memory in offline state:"
> +if [ "$hotpluggable_num" -gt 0 ]; then
> + for memory in `hotpluggable_offline_memory`; do
> + echo "offline->online memory$memory"
> + if ! online_memory_expect_success $memory; then
> + retval=1
> + fi
> + done
> +else
> + echo -e "\t\t SKIPPED - no hot-pluggable memory in offline state"
> +fi
>
> #
> # Test with memory notifier error injection
> @@ -189,15 +234,16 @@ prerequisite_extra()
>
> if [ ! -d "$DEBUGFS" ]; then
> echo $msg debugfs is not mounted >&2
> - exit 0
> + exit $((0+$retval))
> fi
>
> if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then
> echo $msg memory-notifier-error-inject module is not available >&2
> - exit 0
> + exit $((0+$retval))
> fi
> }
>
> +echo -e "\t Test with memory notifier error injection"
> prerequisite_extra
>
> #
> @@ -214,7 +260,7 @@ done
> # Test memory hot-add error handling (offline => online)
> #
> echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
> -for memory in `hotplaggable_offline_memory`; do
> +for memory in `hotpluggable_offline_memory`; do
> online_memory_expect_fail $memory
> done
>
> @@ -222,7 +268,7 @@ done
> # Online all hot-pluggable memory
> #
> echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error
> -for memory in `hotplaggable_offline_memory`; do
> +for memory in `hotpluggable_offline_memory`; do
> online_memory_expect_success $memory
> done
>
> @@ -236,3 +282,5 @@ done
>
> echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
> /sbin/modprobe -q -r memory-notifier-error-inject
> +
> +exit $retval
>