#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 stress_fork() { while true ; do /usr/bin/true sleep 0.01 done } stress_subsys() { local verb=+ while true ; do echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control [ $verb = "+" ] && verb=- || verb=+ # incommensurable period with other stresses sleep 0.011 done } init_and_check() { sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'` if [ ! -d "$sysfs" ]; then echo "Skipping: cgroup2 is not mounted" >&2 exit $ksft_skip fi if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2 exit $ksft_skip fi if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2 exit $ksft_skip fi } declare -a stresses declare -a stress_pids duration=5 rc=0 subsys_ctrl=cpuset sysfs= while getopts c:d:hs: opt; do case $opt in c) subsys_ctrl=$OPTARG ;; d) duration=$OPTARG ;; h) echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .." echo -e "\t default duration $duration seconds" echo -e "\t default controller $subsys_ctrl" exit ;; s) func=stress_$OPTARG if [ "x$(type -t $func)" != "xfunction" ] ; then echo "Unknown stress $OPTARG" exit 1 fi stresses+=($func) ;; esac done shift $((OPTIND - 1)) init_and_check for s in ${stresses[*]} ; do $s & stress_pids+=($!) done time=0 start=$(date +%s) while [ $time -lt $duration ] ; do $* rc=$? [ $rc -eq 0 ] || break time=$(($(date +%s) - $start)) done for pid in ${stress_pids[*]} ; do kill -SIGTERM $pid wait $pid done exit $rc