| #!/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 |