Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: cgroup: Run test_core under interfering stress

test_core tests various cgroup creation/removal and task migration
paths. Run the tests repeatedly with interfering noise (for lockdep
checks). Currently, forking noise and subsystem enabled/disabled
switching are the implemented noises.

Signed-off-by: Michal Koutný <mkoutny@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>

authored by

Michal Koutný and committed by
Tejun Heo
1a99fcc0 11318989

+107
+2
tools/testing/selftests/cgroup/Makefile
··· 3 3 4 4 all: 5 5 6 + TEST_FILES := with_stress.sh 7 + TEST_PROGS := test_stress.sh 6 8 TEST_GEN_PROGS = test_memcontrol 7 9 TEST_GEN_PROGS += test_core 8 10 TEST_GEN_PROGS += test_freezer
+4
tools/testing/selftests/cgroup/test_stress.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + ./with_stress.sh -s subsys -s fork ./test_core
+101
tools/testing/selftests/cgroup/with_stress.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # Kselftest framework requirement - SKIP code is 4. 5 + ksft_skip=4 6 + 7 + stress_fork() 8 + { 9 + while true ; do 10 + /usr/bin/true 11 + sleep 0.01 12 + done 13 + } 14 + 15 + stress_subsys() 16 + { 17 + local verb=+ 18 + while true ; do 19 + echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control 20 + [ $verb = "+" ] && verb=- || verb=+ 21 + # incommensurable period with other stresses 22 + sleep 0.011 23 + done 24 + } 25 + 26 + init_and_check() 27 + { 28 + sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'` 29 + if [ ! -d "$sysfs" ]; then 30 + echo "Skipping: cgroup2 is not mounted" >&2 31 + exit $ksft_skip 32 + fi 33 + 34 + if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then 35 + echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2 36 + exit $ksft_skip 37 + fi 38 + 39 + if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then 40 + echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2 41 + exit $ksft_skip 42 + fi 43 + } 44 + 45 + declare -a stresses 46 + declare -a stress_pids 47 + duration=5 48 + rc=0 49 + subsys_ctrl=cpuset 50 + sysfs= 51 + 52 + while getopts c:d:hs: opt; do 53 + case $opt in 54 + c) 55 + subsys_ctrl=$OPTARG 56 + ;; 57 + d) 58 + duration=$OPTARG 59 + ;; 60 + h) 61 + echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .." 62 + echo -e "\t default duration $duration seconds" 63 + echo -e "\t default controller $subsys_ctrl" 64 + exit 65 + ;; 66 + s) 67 + func=stress_$OPTARG 68 + if [ "x$(type -t $func)" != "xfunction" ] ; then 69 + echo "Unknown stress $OPTARG" 70 + exit 1 71 + fi 72 + stresses+=($func) 73 + ;; 74 + esac 75 + done 76 + shift $((OPTIND - 1)) 77 + 78 + init_and_check 79 + 80 + for s in ${stresses[*]} ; do 81 + $s & 82 + stress_pids+=($!) 83 + done 84 + 85 + 86 + time=0 87 + start=$(date +%s) 88 + 89 + while [ $time -lt $duration ] ; do 90 + $* 91 + rc=$? 92 + [ $rc -eq 0 ] || break 93 + time=$(($(date +%s) - $start)) 94 + done 95 + 96 + for pid in ${stress_pids[*]} ; do 97 + kill -SIGTERM $pid 98 + wait $pid 99 + done 100 + 101 + exit $rc