#!/bin/sh ################################################################################ ## ## ## Copyright (c) 2009 FUJITSU LIMITED ## ## Author: Shi Weihua <shiwh@cn.fujitsu.com> ## ## Copyright (c) 2015 Cedric Hnyda <chnyda@suse.com> ## ## Copyright (c) 2015-2016 Cyril Hrubis <chrubis@suse.cz> ## ## ## ## This program is free software; you can redistribute it and#or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation; either version 2 of the License, or ## ## (at your option) any later version. ## ## ## ## This program is distributed in the hope that it will be useful, but ## ## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## ## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## ## for more details. ## ## ## ## You should have received a copy of the GNU General Public License ## ## along with this program; if not, write to the Free Software Foundation, ## ## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ## ## ## ################################################################################ TCID="cgroup_fj_stress" TST_TOTAL=1 . cgroup_fj_common.sh subsystem="$1" subgroup_num="$2" subgroup_depth="$3" attach_operation="$4" usage_and_exit() { echo "usage of cgroup_fj_stress.sh: " echo " ./cgroup_fj_stress.sh subsystem subgroup_num subgroup_depth attach_operation" echo " subgroup_num" echo " number of subgroups created in group" echo " subgroup_depth" echo " depth of the created tree" echo " attach_operation" echo " none - do not attach anything" echo " one - move one processe around" echo " each - attach process to each subgroup" echo "example: ./cgroup_fj_stress.sh cpuset 1 1 one" echo tst_brkm TBROK "$1" } if [ "$#" -ne "4" ]; then usage_and_exit "Wrong number of parameters, expected 4" fi case $subgroup_num in ''|*[!0-9]*) usage_and_exit "Number of subgroups must be possitive integer";; *) ;; esac case $subgroup_depth in ''|*[!0-9]*) usage_and_exit "Depth of the subgroup tree must be possitive integer";; *) ;; esac case $attach_operation in 'none'|'one'|'each');; *) usage_and_exit "Invalid attach operation: $attach_operation";; esac setup export TMPFILE=./tmp_tasks.$$ count=0 build_subgroups() { local cur_path="$1" local cur_depth="$2" local i if [ "$cur_depth" -gt "$subgroup_depth" ]; then return fi create_subgroup "$cur_path" count=$((count+1)) for i in $(seq 1 $subgroup_num); do build_subgroups "$cur_path/$i" $((cur_depth+1)) done } attach_task() { local cur_path="$1" local cur_depth="$2" local ppid="$3" local i if [ "$cur_depth" -gt "$subgroup_depth" ]; then return fi if [ -z "$ppid" ]; then cgroup_fj_proc& pid=$! else pid="$ppid" fi if ! attach_and_check "$pid" "$cur_path"; then fail=1 fi for i in $(seq 1 $subgroup_num); do local new_path="$cur_path/$i" attach_task "$new_path" $((cur_depth+1)) "$ppid" done if [ -n "$ppid" ]; then if ! attach_and_check "$pid" "$cur_path"; then fail=1 fi fi } start_path="$mount_point/ltp" tst_resm TINFO "Creating subgroups ..." build_subgroups "$start_path" 0 tst_resm TINFO "... mkdired $count times" case $attach_operation in "one" ) cgroup_fj_proc & pid=$! tst_resm TINFO "Moving one task around" attach_task "$start_path" 0 "$pid" ROD kill -9 "$pid" wait "$pid" ;; "each" ) tst_resm TINFO "Attaching task to each subgroup" attach_task "$start_path" 0 ROD killall -9 "cgroup_fj_proc" # Wait for attached tasks to terminate wait ;; * ) ;; esac if [ -n "$fail" ]; then tst_resm TFAIL "Attaching tasks failed!" else tst_resm TPASS "All done!" fi tst_exit