1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# Kselftest framework requirement - SKIP code is 4. 5ksft_skip=4 6 7stress_fork() 8{ 9 while true ; do 10 /usr/bin/true 11 sleep 0.01 12 done 13} 14 15stress_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 26init_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 45declare -a stresses 46declare -a stress_pids 47duration=5 48rc=0 49subsys_ctrl=cpuset 50sysfs= 51 52while 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 75done 76shift $((OPTIND - 1)) 77 78init_and_check 79 80for s in ${stresses[*]} ; do 81 $s & 82 stress_pids+=($!) 83done 84 85 86time=0 87start=$(date +%s) 88 89while [ $time -lt $duration ] ; do 90 $* 91 rc=$? 92 [ $rc -eq 0 ] || break 93 time=$(($(date +%s) - $start)) 94done 95 96for pid in ${stress_pids[*]} ; do 97 kill -SIGTERM $pid 98 wait $pid 99done 100 101exit $rc 102