Commit ddddda9b authored by Shuah Khan's avatar Shuah Khan Committed by Greg Kroah-Hartman

tools: selftests - create a separate hotplug target for full range test

On some systems, hot-plug tests could hang forever waiting for cpu and
memory to be ready to be offlined. A special hot-plug target is created
to run full range of hot-plug tests. In default mode, hot-plug tests run
in safe mode with a limited scope. In limited mode, cpu-hotplug test is
run on a single cpu as opposed to all hotplug capable cpus, and memory
hotplug test is run on 2% of hotplug capable memory instead of 10%. In
addition to the above change, cpu-hotplug is chnged to change processor
affinity to cpu 0 so it doesn't impact itself while the test runs.
Signed-off-by: default avatarShuah Khan <shuah.kh@samsung.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Michael Ellerman <michael@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6e7e6c34
...@@ -12,6 +12,9 @@ TARGETS += powerpc ...@@ -12,6 +12,9 @@ TARGETS += powerpc
TARGETS += user TARGETS += user
TARGETS += sysctl TARGETS += sysctl
TARGETS_HOTPLUG = cpu-hotplug
TARGETS_HOTPLUG += memory-hotplug
all: all:
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \
make -C $$TARGET; \ make -C $$TARGET; \
...@@ -22,6 +25,21 @@ run_tests: all ...@@ -22,6 +25,21 @@ run_tests: all
make -C $$TARGET run_tests; \ make -C $$TARGET run_tests; \
done; done;
hotplug:
for TARGET in $(TARGETS_HOTPLUG); do \
make -C $$TARGET; \
done;
run_hotplug: hotplug
for TARGET in $(TARGETS_HOTPLUG); do \
make -C $$TARGET run_full_test; \
done;
clean_hotplug:
for TARGET in $(TARGETS_HOTPLUG); do \
make -C $$TARGET clean; \
done;
clean: clean:
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \
make -C $$TARGET clean; \ make -C $$TARGET clean; \
......
...@@ -4,8 +4,15 @@ The kernel contains a set of "self tests" under the tools/testing/selftests/ ...@@ -4,8 +4,15 @@ The kernel contains a set of "self tests" under the tools/testing/selftests/
directory. These are intended to be small unit tests to exercise individual directory. These are intended to be small unit tests to exercise individual
code paths in the kernel. code paths in the kernel.
Running the selftests On some systems, hot-plug tests could hang forever waiting for cpu and
===================== memory to be ready to be offlined. A special hot-plug target is created
to run full range of hot-plug tests. In default mode, hot-plug tests run
in safe mode with a limited scope. In limited mode, cpu-hotplug test is
run on a single cpu as opposed to all hotplug capable cpus, and memory
hotplug test is run on 2% of hotplug capable memory instead of 10%.
Running the selftests (hotplug tests are run in limited mode)
=============================================================
To build the tests: To build the tests:
...@@ -18,14 +25,26 @@ To run the tests: ...@@ -18,14 +25,26 @@ To run the tests:
- note that some tests will require root privileges. - note that some tests will require root privileges.
To run only tests targeted for a single subsystem: (including
To run only tests targetted for a single subsystem: hotplug targets in limited mode)
$ make -C tools/testing/selftests TARGETS=cpu-hotplug run_tests $ make -C tools/testing/selftests TARGETS=cpu-hotplug run_tests
See the top-level tools/testing/selftests/Makefile for the list of all possible See the top-level tools/testing/selftests/Makefile for the list of all possible
targets. targets.
Running the full range hotplug selftests
========================================
To build the tests:
$ make -C tools/testing/selftests hotplug
To run the tests:
$ make -C tools/testing/selftests run_hotplug
- note that some tests will require root privileges.
Contributing new tests Contributing new tests
====================== ======================
......
...@@ -3,4 +3,7 @@ all: ...@@ -3,4 +3,7 @@ all:
run_tests: run_tests:
@/bin/bash ./on-off-test.sh || echo "cpu-hotplug selftests: [FAIL]" @/bin/bash ./on-off-test.sh || echo "cpu-hotplug selftests: [FAIL]"
run_full_test:
@/bin/bash ./on-off-test.sh -a || echo "cpu-hotplug selftests: [FAIL]"
clean: clean:
...@@ -11,6 +11,8 @@ prerequisite() ...@@ -11,6 +11,8 @@ prerequisite()
exit 0 exit 0
fi fi
taskset -p 01 $$
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
if [ ! -d "$SYSFS" ]; then if [ ! -d "$SYSFS" ]; then
...@@ -22,6 +24,19 @@ prerequisite() ...@@ -22,6 +24,19 @@ prerequisite()
echo $msg cpu hotplug is not supported >&2 echo $msg cpu hotplug is not supported >&2
exit 0 exit 0
fi fi
echo "CPU online/offline summary:"
online_cpus=`cat $SYSFS/devices/system/cpu/online`
online_max=${online_cpus##*-}
echo -e "\t Cpus in online state: $online_cpus"
offline_cpus=`cat $SYSFS/devices/system/cpu/offline`
if [[ "a$offline_cpus" = "a" ]]; then
offline_cpus=0
else
offline_max=${offline_cpus##*-}
fi
echo -e "\t Cpus in offline state: $offline_cpus"
} }
# #
...@@ -113,15 +128,25 @@ offline_cpu_expect_fail() ...@@ -113,15 +128,25 @@ offline_cpu_expect_fail()
} }
error=-12 error=-12
allcpus=0
priority=0 priority=0
online_cpus=0
online_max=0
offline_cpus=0
offline_max=0
while getopts e:hp: opt; do while getopts e:ahp: opt; do
case $opt in case $opt in
e) e)
error=$OPTARG error=$OPTARG
;; ;;
a)
allcpus=1
;;
h) h)
echo "Usage $0 [ -e errno ] [ -p notifier-priority ]" echo "Usage $0 [ -a ] [ -e errno ] [ -p notifier-priority ]"
echo -e "\t default offline one cpu"
echo -e "\t run with -a option to offline all cpus"
exit exit
;; ;;
p) p)
...@@ -137,6 +162,29 @@ fi ...@@ -137,6 +162,29 @@ fi
prerequisite prerequisite
#
# Safe test (default) - offline and online one cpu
#
if [ $allcpus -eq 0 ]; then
echo "Limited scope test: one hotplug cpu"
echo -e "\t (leaves cpu in the original state):"
echo -e "\t online to offline to online: cpu $online_max"
offline_cpu_expect_success $online_max
online_cpu_expect_success $online_max
if [[ $offline_cpus -gt 0 ]]; then
echo -e "\t offline to online to offline: cpu $offline_max"
online_cpu_expect_success $offline_max
offline_cpu_expect_success $offline_max
fi
exit 0
else
echo "Full scope test: all hotplug cpus"
echo -e "\t online all offline cpus"
echo -e "\t offline all online cpus"
echo -e "\t online all offline cpus"
fi
# #
# Online all hot-pluggable CPUs # Online all hot-pluggable CPUs
# #
......
all: all:
run_tests: run_tests:
@/bin/bash ./on-off-test.sh -r 2 || echo "memory-hotplug selftests: [FAIL]"
run_full_test:
@/bin/bash ./on-off-test.sh || echo "memory-hotplug selftests: [FAIL]" @/bin/bash ./on-off-test.sh || echo "memory-hotplug selftests: [FAIL]"
clean: clean:
...@@ -142,10 +142,16 @@ fi ...@@ -142,10 +142,16 @@ fi
prerequisite 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 # Online all hot-pluggable memory
# #
for memory in `hotplaggable_offline_memory`; do for memory in `hotplaggable_offline_memory`; do
echo offline-online $memory
online_memory_expect_success $memory online_memory_expect_success $memory
done done
...@@ -154,6 +160,7 @@ done ...@@ -154,6 +160,7 @@ done
# #
for memory in `hotpluggable_online_memory`; do for memory in `hotpluggable_online_memory`; do
if [ $((RANDOM % 100)) -lt $ratio ]; then if [ $((RANDOM % 100)) -lt $ratio ]; then
echo online-offline $memory
offline_memory_expect_success $memory offline_memory_expect_success $memory
fi fi
done done
...@@ -162,6 +169,7 @@ done ...@@ -162,6 +169,7 @@ done
# Online all hot-pluggable memory again # Online all hot-pluggable memory again
# #
for memory in `hotplaggable_offline_memory`; do for memory in `hotplaggable_offline_memory`; do
echo offline-online $memory
online_memory_expect_success $memory online_memory_expect_success $memory
done done
......
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