162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4. 562306a36Sopenharmony_ciksft_skip=4 662306a36Sopenharmony_ci 762306a36Sopenharmony_cistress_fork() 862306a36Sopenharmony_ci{ 962306a36Sopenharmony_ci while true ; do 1062306a36Sopenharmony_ci /usr/bin/true 1162306a36Sopenharmony_ci sleep 0.01 1262306a36Sopenharmony_ci done 1362306a36Sopenharmony_ci} 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistress_subsys() 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci local verb=+ 1862306a36Sopenharmony_ci while true ; do 1962306a36Sopenharmony_ci echo $verb$subsys_ctrl >$sysfs/cgroup.subtree_control 2062306a36Sopenharmony_ci [ $verb = "+" ] && verb=- || verb=+ 2162306a36Sopenharmony_ci # incommensurable period with other stresses 2262306a36Sopenharmony_ci sleep 0.011 2362306a36Sopenharmony_ci done 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciinit_and_check() 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci sysfs=`mount -t cgroup2 | head -1 | awk '{ print $3 }'` 2962306a36Sopenharmony_ci if [ ! -d "$sysfs" ]; then 3062306a36Sopenharmony_ci echo "Skipping: cgroup2 is not mounted" >&2 3162306a36Sopenharmony_ci exit $ksft_skip 3262306a36Sopenharmony_ci fi 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci if ! echo +$subsys_ctrl >$sysfs/cgroup.subtree_control ; then 3562306a36Sopenharmony_ci echo "Skipping: cannot enable $subsys_ctrl in $sysfs" >&2 3662306a36Sopenharmony_ci exit $ksft_skip 3762306a36Sopenharmony_ci fi 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci if ! echo -$subsys_ctrl >$sysfs/cgroup.subtree_control ; then 4062306a36Sopenharmony_ci echo "Skipping: cannot disable $subsys_ctrl in $sysfs" >&2 4162306a36Sopenharmony_ci exit $ksft_skip 4262306a36Sopenharmony_ci fi 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cideclare -a stresses 4662306a36Sopenharmony_cideclare -a stress_pids 4762306a36Sopenharmony_ciduration=5 4862306a36Sopenharmony_circ=0 4962306a36Sopenharmony_cisubsys_ctrl=cpuset 5062306a36Sopenharmony_cisysfs= 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ciwhile getopts c:d:hs: opt; do 5362306a36Sopenharmony_ci case $opt in 5462306a36Sopenharmony_ci c) 5562306a36Sopenharmony_ci subsys_ctrl=$OPTARG 5662306a36Sopenharmony_ci ;; 5762306a36Sopenharmony_ci d) 5862306a36Sopenharmony_ci duration=$OPTARG 5962306a36Sopenharmony_ci ;; 6062306a36Sopenharmony_ci h) 6162306a36Sopenharmony_ci echo "Usage $0 [ -s stress ] ... [ -d duration ] [-c controller] cmd args .." 6262306a36Sopenharmony_ci echo -e "\t default duration $duration seconds" 6362306a36Sopenharmony_ci echo -e "\t default controller $subsys_ctrl" 6462306a36Sopenharmony_ci exit 6562306a36Sopenharmony_ci ;; 6662306a36Sopenharmony_ci s) 6762306a36Sopenharmony_ci func=stress_$OPTARG 6862306a36Sopenharmony_ci if [ "x$(type -t $func)" != "xfunction" ] ; then 6962306a36Sopenharmony_ci echo "Unknown stress $OPTARG" 7062306a36Sopenharmony_ci exit 1 7162306a36Sopenharmony_ci fi 7262306a36Sopenharmony_ci stresses+=($func) 7362306a36Sopenharmony_ci ;; 7462306a36Sopenharmony_ci esac 7562306a36Sopenharmony_cidone 7662306a36Sopenharmony_cishift $((OPTIND - 1)) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ciinit_and_check 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cifor s in ${stresses[*]} ; do 8162306a36Sopenharmony_ci $s & 8262306a36Sopenharmony_ci stress_pids+=($!) 8362306a36Sopenharmony_cidone 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_citime=0 8762306a36Sopenharmony_cistart=$(date +%s) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciwhile [ $time -lt $duration ] ; do 9062306a36Sopenharmony_ci $* 9162306a36Sopenharmony_ci rc=$? 9262306a36Sopenharmony_ci [ $rc -eq 0 ] || break 9362306a36Sopenharmony_ci time=$(($(date +%s) - $start)) 9462306a36Sopenharmony_cidone 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cifor pid in ${stress_pids[*]} ; do 9762306a36Sopenharmony_ci kill -SIGTERM $pid 9862306a36Sopenharmony_ci wait $pid 9962306a36Sopenharmony_cidone 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciexit $rc 102