blob: 8c0de3d19a2e45b91d8f985ab7fe2f11e7a12fe1 [file] [log] [blame]
#! /bin/sh
################################################################################
## ##
## Copyright (c) 2009 FUJITSU LIMITED ##
## ##
## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ##
## ##
## Author: Shi Weihua <shiwh@cn.fujitsu.com> ##
## ##
################################################################################
subsystem=$1
remount_use=$2
noprefix_use=$3
release_agent_para=$4
subgroup_exist=$5
attach_operation=$6
remove_operation=$7
notify_on_release=$8
release_agent_echo=$9
subsystem_str="";
remount_use_str="";
noprefix_use_str="";
release_agent_para_str="";
notify_on_release_str="";
release_agent_str="";
expectted=1;
# Create some processes and move them to cgroups
pid=0;
pid2=0;
# not output debug info
no_debug=0
usage()
{
echo "usage of cgroup_fj_function.sh: "
echo " ./cgroup_fj_function.sh -subsystem -remount_use -noprefix_use -release_agent_para"
echo " -subgroup_exist -attach_operation -remove_operation"
echo " -notify_on_release -release_agent_echo"
echo " subsystem's usable number"
echo " 1: debug"
echo " 2: cpuset"
echo " 3: ns"
echo " 4: cpu"
echo " 5: cpuacct"
echo " 6: memory"
echo " 7: all"
echo " 8: (none)"
echo " 9: debug,debug"
echo " 10: (nonexistent subsystem), e.g. abc"
echo " 11: freezer"
echo " 12: devices"
echo " remount_use's usable number"
echo " 1: do not use remount in "-o"'s parameter"
echo " 2: use it"
echo " noprefix_use's usable number"
echo " 1: do not use noprefix in "-o"'s parameter"
echo " 2: use it. only cpuset available"
echo " release_agent_para's usable number"
echo " 1: don't use release_agent_para= in "-o"'s parameter"
echo " 2: empty after "=""
echo " 3: available commad"
echo " 4: command name exclude full path"
echo " 5: command in /sbin"
echo " 6: command in other directory"
echo " 7: nonexistent command"
echo " 8: no-permission command"
echo " subgroup_exist's usable number"
echo " 1: subgroup will been created"
echo " 2: subgroup will not been created"
echo " attach_operation's usable number"
echo " 1: attach nothing"
echo " 2: attach one process by echo"
echo " 3: attach all processes in root group by echo"
echo " 4: attach child forked processes automatically"
echo " 5: move one process to other subgroup by echo"
echo " 6: move all processes to other subgroup by echo"
echo " remove_operation's usable number"
echo " 1: remove nothing"
echo " 2: remove some processes by echo"
echo " 3: remove all processes in sub group by echo"
echo " 4: remove some processes by kill"
echo " 5: remove all forked processes by kill"
echo " notify_on_release's usable number"
echo " 1: echo 0 to notify_on_release"
echo " 2: echo 1 to notify_on_release"
echo " 3: echo 2 to notify_on_release"
echo " 4: echo -1 to notify_on_release"
echo " 5: echo 0ddd to notify_on_release"
echo " 6: echo 1ddd to notify_on_release"
echo " 7: echo ddd1 to notify_on_release"
echo " release_agent_echo's usable number"
echo " 1: echo nothing to release_agent"
echo " 2: available commad"
echo " 3: command name exclude full path"
echo " 4: command in /sbin"
echo " 5: command in other directory"
echo " 6: nonexistent command"
echo " 7: no-permission command"
echo "example: ./cgroup_fj_function.sh 1 1 1 1 1 1 1 1 1"
echo " will use "debug" to test, will not use option "remount","noprefix","release_agent""
echo " in in "-o"'s parameter, will create some subgroup, will not attach/remove any process"
echo " will echo 0 to notify_on_release and will not echo anything to release_agent"
}
export TESTROOT=`pwd`
if [ "$LOGFILE" = "" ]; then
LOGFILE="/dev/stdout"
fi
export TMPFILE=$TESTROOT/tmp_tasks
. $TESTROOT/cgroup_fj_utility.sh
########################## main #######################
if [ "$#" -ne "9" ]; then
echo "ERROR: Wrong inputed parameter..Exiting test" >> $LOGFILE;
usage;
exit -1;
fi
echo "-------------------------------------------------------------------------" >> $LOGFILE
echo "case no : $CASENO1" >> $LOGFILE
echo `date` >> $LOGFILE
check_para;
if [ $? -ne 0 ]; then
usage;
exit -1;
fi
setup;
echo "INFO: now we begin to test no $CASENO1 ..." >> $LOGFILE
mount_cgroup;
$TESTROOT/cgroup_fj_proc &
pid=$!
mkdir_subgroup;
# cpuset.cpus and cpuset.mems should be specified with suitable value
# before attaching operation if subsystem is cpuset
if [ $subsystem -eq 2 ] || [ $subsystem -eq 7 ] || [ $subsystem -eq 8 ] ; then
exist=`grep -w cpuset /proc/cgroups | cut -f1`;
if [ "$exist" != "" ]; then
if [ $noprefix_use -eq 2 ]; then
do_echo 1 1 `cat /dev/cgroup/cpus` /dev/cgroup/subgroup_1/cpus;
do_echo 1 1 `cat /dev/cgroup/mems` /dev/cgroup/subgroup_1/mems;
else
do_echo 1 1 `cat /dev/cgroup/cpuset.cpus` /dev/cgroup/subgroup_1/cpuset.cpus;
do_echo 1 1 `cat /dev/cgroup/cpuset.mems` /dev/cgroup/subgroup_1/cpuset.mems;
fi
fi
fi
# attaching operation
case $attach_operation in
"1" )
;;
"2" )
do_echo 1 1 $pid /dev/cgroup/subgroup_1/tasks;
;;
"3" )
$TESTROOT/cgroup_fj_proc &
pid2=$!
cat /dev/cgroup/tasks > $TMPFILE
nlines=`cat $TMPFILE | wc -l`
for i in `seq 1 $nlines`
do
cur_pid=`sed -n "$i""p" $TMPFILE`
if [ -e /proc/$cur_pid/ ];then
do_echo 1 1 "$cur_pid" /dev/cgroup/subgroup_1/tasks
fi
done
;;
"4" )
do_echo 1 1 $pid /dev/cgroup/subgroup_1/tasks;
sleep 1
do_kill 1 1 10 $pid
;;
esac
# echo notify_on_release that analysed from parameter
case $notify_on_release in
"1"|"2"|"3")
expectted=1
;;
*)
expectted=0
;;
esac
#if [ $notify_on_release -ne 0 ] && [ $notify_on_release -ne 1 ] && [ $notify_on_release -ne 2 ];then
# expectted=0
#fi
do_echo 1 $expectted $notify_on_release_str /dev/cgroup/subgroup_1/notify_on_release;
# echo release_agent that analysed from parameter
if [ $release_agent_echo -ne 1 ]; then
do_echo 1 1 $release_agent_str /dev/cgroup/release_agent;
fi
sleep 1
# pid could not be echoed from subgroup if subsystem is ( or include ) ns,
# so we kill them here
if [ $subsystem -eq 3 ] || [ $subsystem -eq 7 ] || [ $subsystem -eq 8 ] ; then
do_kill 1 1 9 $pid
do_kill 1 1 9 $pid2
# removing operation
else
case $remove_operation in
"1" )
;;
"2" )
do_echo 1 1 $pid /dev/cgroup/tasks
if [ $pid2 -ne 0 ] ; then
do_echo 1 1 $pid2 /dev/cgroup/tasks
fi
;;
"3" )
cat /dev/cgroup/subgroup_1/tasks > $TMPFILE
nlines=`cat $TMPFILE | wc -l`
if [ $nlines -ne 0 ]; then
for i in `seq 1 $nlines`
do
cur_pid=`sed -n "$i""p" $TMPFILE`
if [ -e /proc/$cur_pid/ ];then
do_echo 1 1 "$cur_pid" /dev/cgroup/tasks
fi
done
fi
;;
"4" )
do_kill 1 1 9 $pid
;;
"5" )
do_kill 1 1 9 $pid
do_kill 1 1 9 $pid2
;;
esac
fi
sleep 1
do_rmdir 0 1 /dev/cgroup/subgroup_*
cleanup;
do_kill 1 1 9 $pid
do_kill 1 1 9 $pid2
sleep 1
exit 0;