Jelajahi Sumber

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: Shuah 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Shuah Khan 11 tahun lalu
induk
melakukan
ddddda9bc4

+ 18 - 0
tools/testing/selftests/Makefile

@@ -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
 		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; \

+ 23 - 4
tools/testing/selftests/README.txt

@@ -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:
 
 
 - note that some tests will require root privileges.
 - note that some tests will require root privileges.
 
 
-
-To run only tests targetted for a single subsystem:
+To run only tests targeted for a single subsystem: (including
+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 - 0
tools/testing/selftests/cpu-hotplug/Makefile

@@ -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:

+ 50 - 2
tools/testing/selftests/cpu-hotplug/on-off-test.sh

@@ -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()
 		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()
 }
 }
 
 
 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
 
 
 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
 #
 #

+ 3 - 0
tools/testing/selftests/memory-hotplug/Makefile

@@ -1,6 +1,9 @@
 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:

+ 8 - 0
tools/testing/selftests/memory-hotplug/on-off-test.sh

@@ -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
 #
 #
 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
 # 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