Commit 5ff0c60b authored by Po-Hsu Lin's avatar Po-Hsu Lin Committed by Shuah Khan

selftests: fix memory-hotplug test

In the memory offline test, the $ration 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.

A nice example:
$ sudo ./test.sh
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
$ echo $?
0
Signed-off-by: default avatarPo-Hsu Lin <po-hsu.lin@canonical.com>
Signed-off-by: default avatarShuah Khan <shuahkh@osg.samsung.com>
parent 02d8f075
...@@ -80,9 +80,12 @@ online_memory_expect_success() ...@@ -80,9 +80,12 @@ online_memory_expect_success()
if ! online_memory $memory; then if ! online_memory $memory; then
echo $FUNCNAME $memory: unexpected fail >&2 echo $FUNCNAME $memory: unexpected fail >&2
return 1
elif ! memory_is_online $memory; then elif ! memory_is_online $memory; then
echo $FUNCNAME $memory: unexpected offline >&2 echo $FUNCNAME $memory: unexpected offline >&2
return 1
fi fi
return 0
} }
online_memory_expect_fail() online_memory_expect_fail()
...@@ -91,9 +94,12 @@ online_memory_expect_fail() ...@@ -91,9 +94,12 @@ online_memory_expect_fail()
if online_memory $memory 2> /dev/null; then if online_memory $memory 2> /dev/null; then
echo $FUNCNAME $memory: unexpected success >&2 echo $FUNCNAME $memory: unexpected success >&2
return 1
elif ! memory_is_offline $memory; then elif ! memory_is_offline $memory; then
echo $FUNCNAME $memory: unexpected online >&2 echo $FUNCNAME $memory: unexpected online >&2
return 1
fi fi
return 0
} }
offline_memory_expect_success() offline_memory_expect_success()
...@@ -102,9 +108,12 @@ offline_memory_expect_success() ...@@ -102,9 +108,12 @@ offline_memory_expect_success()
if ! offline_memory $memory; then if ! offline_memory $memory; then
echo $FUNCNAME $memory: unexpected fail >&2 echo $FUNCNAME $memory: unexpected fail >&2
return 1
elif ! memory_is_offline $memory; then elif ! memory_is_offline $memory; then
echo $FUNCNAME $memory: unexpected offline >&2 echo $FUNCNAME $memory: unexpected offline >&2
return 1
fi fi
return 0
} }
offline_memory_expect_fail() offline_memory_expect_fail()
...@@ -113,14 +122,18 @@ offline_memory_expect_fail() ...@@ -113,14 +122,18 @@ offline_memory_expect_fail()
if offline_memory $memory 2> /dev/null; then if offline_memory $memory 2> /dev/null; then
echo $FUNCNAME $memory: unexpected success >&2 echo $FUNCNAME $memory: unexpected success >&2
return 1
elif ! memory_is_online $memory; then elif ! memory_is_online $memory; then
echo $FUNCNAME $memory: unexpected offline >&2 echo $FUNCNAME $memory: unexpected offline >&2
return 1
fi fi
return 0
} }
error=-12 error=-12
priority=0 priority=0
ratio=10 ratio=10
retval=0
while getopts e:hp:r: opt; do while getopts e:hp:r: opt; do
case $opt in case $opt in
...@@ -152,35 +165,58 @@ fi ...@@ -152,35 +165,58 @@ fi
prerequisite prerequisite
echo "Test scope: $ratio% hotplug memory" 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 # Online all hot-pluggable memory
# #
for memory in `hotpluggable_offline_memory`; do hotpluggable_num=`hotpluggable_offline_memory | wc -l`
echo offline-online $memory echo -e "\t online all hot-pluggable memory in offline state:"
online_memory_expect_success $memory if [ "$hotpluggable_num" -gt 0 ]; then
done 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 # 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 for memory in `hotpluggable_online_memory`; do
if [ $((RANDOM % 100)) -lt $ratio ]; then if [ "$target" -gt 0 ]; then
echo online-offline $memory echo "online->offline memory$memory"
offline_memory_expect_success $memory if offline_memory_expect_success $memory; then
target=$(($target - 1))
fi
fi fi
done 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 # Online all hot-pluggable memory again
# #
for memory in `hotpluggable_offline_memory`; do hotpluggable_num=`hotpluggable_offline_memory | wc -l`
echo offline-online $memory echo -e "\t online all hot-pluggable memory in offline state:"
online_memory_expect_success $memory if [ "$hotpluggable_num" -gt 0 ]; then
done 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 # Test with memory notifier error injection
...@@ -198,12 +234,12 @@ prerequisite_extra() ...@@ -198,12 +234,12 @@ prerequisite_extra()
if [ ! -d "$DEBUGFS" ]; then if [ ! -d "$DEBUGFS" ]; then
echo $msg debugfs is not mounted >&2 echo $msg debugfs is not mounted >&2
exit 0 exit $retval
fi fi
if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then
echo $msg memory-notifier-error-inject module is not available >&2 echo $msg memory-notifier-error-inject module is not available >&2
exit 0 exit $retval
fi fi
} }
...@@ -246,3 +282,5 @@ done ...@@ -246,3 +282,5 @@ done
echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error
/sbin/modprobe -q -r memory-notifier-error-inject /sbin/modprobe -q -r memory-notifier-error-inject
exit $retval
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment