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