445 lines
10 KiB
Bash
445 lines
10 KiB
Bash
#!/bin/bash
|
|
# usage ./runlibcgrouptest.sh
|
|
# Copyright IBM Corporation. 2008
|
|
#
|
|
# Author: Sudhir Kumar <skumar@linux.vnet.ibm.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of version 2.1 of the GNU Lesser General Public License
|
|
# as published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
#
|
|
# Description: This script runs the the basic tests for testing libcgroup apis.
|
|
#
|
|
|
|
# TODO path to config.h have to be set properly
|
|
OPAQUE_HIERARCHY=`grep "OPAQUE_HIERARCHY" /home/jchaloup/packaging/fedora/libcgroup/libcgroup-0.41/config.h |\
|
|
cut -d" " -f3 | sed 's|\"||g'`
|
|
DEBUG=false; # for debug messages
|
|
FS_MOUNTED=0; # 0 for not mounted, 1 for mounted, 2 for multimounted
|
|
MOUNTPOINT=/dev/cgroup_controllers; # Just to initialize
|
|
TARGET=/dev/cgroup_controllers;
|
|
CONTROLLERS=cpu,memory;
|
|
NUM_MOUNT=1; # Number of places to be mounted on
|
|
MULTIMOUNT=false; # mounted at one point only
|
|
NUM_CTLRS=0; # num of controllers supported
|
|
CTLR1="";
|
|
CTLR2="";
|
|
CPU="";
|
|
MEMORY="";
|
|
SKIP_TEST=77
|
|
RET=0
|
|
|
|
declare -a allcontrollers;
|
|
declare -a targets;
|
|
|
|
debug()
|
|
{
|
|
# Function parameter is the string to print out
|
|
if $DEBUG
|
|
then
|
|
echo SH:DBG: $1;
|
|
fi
|
|
}
|
|
|
|
check_mount_fs ()
|
|
{
|
|
local NUM_MOUNT=0;
|
|
CGROUP=`cat /proc/mounts|grep -w ^cgroup|tr -s [:space:]|cut -d" " -f3`;
|
|
|
|
# get first word in case of multiple mounts
|
|
CGROUP=`echo $CGROUP|cut -d" " -f1`;
|
|
|
|
debug "check_mount_fs(): CGROUP is $CGROUP";
|
|
if [ "$CGROUP" = "cgroup" ]
|
|
then
|
|
NUM_MOUNT=`cat /proc/mounts|grep -w ^cgroup|wc -l`;
|
|
debug "check_mount_fs(): fs mounted at $NUM_MOUNT places";
|
|
|
|
if [ $NUM_MOUNT -eq 1 ]
|
|
then
|
|
FS_MOUNTED=1;
|
|
else
|
|
# Any number of mounts is multi mount
|
|
FS_MOUNTED=2;
|
|
fi;
|
|
return 0; # True
|
|
else
|
|
FS_MOUNTED=0;
|
|
return 1; # false
|
|
fi
|
|
}
|
|
|
|
umount_fs ()
|
|
{
|
|
PROC_ENTRY_NUMBER=`cat /proc/mounts|grep ^cgroup | wc -l`;
|
|
NUMBER=1;
|
|
#go and remove all ot opaque mount points
|
|
while [ $PROC_ENTRY_NUMBER -ge $NUMBER ]
|
|
do
|
|
# Get $NUMBER-th mountpoint in case of multiple mount
|
|
PROC_ENTRY=`cat /proc/mounts|grep ^cgroup|\
|
|
tr -s [:space:]|cut -d" " -f2 |\
|
|
head -n$NUMBER | tail -n1`;
|
|
# if the hierarchy is opaque skip to next item
|
|
if [ -n "$OPAQUE_HIERARCHY" ]
|
|
then
|
|
# find whether is the NUMBER-th item opaque
|
|
PROC_ENTRY_OPT=`cat /proc/mounts|grep ^cgroup|\
|
|
tr -s [:space:]|cut -d" " -f4 |\
|
|
head -n$NUMBER | tail -n1`;
|
|
echo $PROC_ENTRY_OPT | grep $OPAQUE_HIERARCHY
|
|
# if yes skip it to the next item
|
|
if [ $? -eq 0 ]
|
|
then
|
|
let NUMBER=$NUMBER+1
|
|
continue
|
|
fi;
|
|
fi;
|
|
# remove the item
|
|
if [ ! -z "$PROC_ENTRY" ]
|
|
then
|
|
TARGET=$PROC_ENTRY;
|
|
# Need to take care of running tasks in any group ??
|
|
rmdir $TARGET/* 2> /dev/null ;
|
|
umount $TARGET;
|
|
rmdir $TARGET;
|
|
debug "umounted $TARGET";
|
|
fi;
|
|
# go to the next item
|
|
let NUMBER=$NUMBER+1
|
|
done;
|
|
FS_MOUNTED=0;
|
|
TARGET=/dev/cgroup_controllers; #??
|
|
echo "Cleanup done";
|
|
}
|
|
|
|
# Put all the supported controllers in an array
|
|
# We have the priority for cpu and memory controller. So prefer to mount
|
|
# them if they exist
|
|
get_all_controllers()
|
|
{
|
|
while [ 1 ]; do
|
|
read line || break;
|
|
if ! echo $line | grep -q ^#
|
|
then
|
|
allcontrollers[$NUM_CTLRS]=`echo $line | cut -d" " -f1`;
|
|
if [ ${allcontrollers[$NUM_CTLRS]} == "cpu" ]; then
|
|
CPU="cpu";
|
|
elif [ ${allcontrollers[$NUM_CTLRS]} == "memory" ]; then
|
|
MEMORY="memory";
|
|
fi;
|
|
debug "controller: ${allcontrollers[$NUM_CTLRS]}";
|
|
NUM_CTLRS=`expr $NUM_CTLRS + 1`;
|
|
fi
|
|
done < /proc/cgroups;
|
|
debug "Total controllers $NUM_CTLRS";
|
|
}
|
|
|
|
# Get a second controller other than cpu or memory
|
|
get_second_controller()
|
|
{
|
|
local i=0;
|
|
while [ $i -lt $NUM_CTLRS ]
|
|
do
|
|
if [ "${allcontrollers[$i]}" != "cpu" ] &&
|
|
[ "${allcontrollers[$i]}" != "memory" ]
|
|
then
|
|
CTLR2=${allcontrollers[$i]};
|
|
return 0;
|
|
fi;
|
|
i=`expr $i + 1`;
|
|
done;
|
|
}
|
|
|
|
# Check if kernel is not having any of the controllers enabled
|
|
no_controllers()
|
|
{
|
|
# prefer if cpu and memory controller are enabled
|
|
if [ ! -z $CPU ] && [ ! -z $MEMORY ]
|
|
then
|
|
CONTROLLERS=$CPU,$MEMORY ;
|
|
CTLR1=$CPU;
|
|
CTLR2=$MEMORY;
|
|
debug "first controller is $CTLR1";
|
|
debug "second controller is $CTLR2";
|
|
return 1; # false
|
|
elif [ ! -z $CPU ]
|
|
then
|
|
CONTROLLERS=$CPU ;
|
|
CTLR1=$CPU;
|
|
get_second_controller;
|
|
debug "first controller is $CTLR1";
|
|
debug "second controller is $CTLR2";
|
|
return 1; # false
|
|
elif [ ! -z $MEMORY ]
|
|
then
|
|
CONTROLLERS=$MEMORY ;
|
|
CTLR1=$MEMORY;
|
|
get_second_controller;
|
|
debug "first controller is $CTLR1";
|
|
debug "second controller is $CTLR2";
|
|
return 1; # false
|
|
fi;
|
|
# Kernel has neither cpu nor memory controller enabled. So there is
|
|
# no point in running the testcases. At least one of them should be
|
|
# supported.(or should I run testcases with controllers such as
|
|
# ns, devices etc? Thoughts???)
|
|
if [ $NUM_CTLRS -lt 2 ]
|
|
then
|
|
echo "Kernel needs to have 2 controllers enabled";
|
|
echo "Recompile your kernel with at least 2 controllers"
|
|
echo "Exiting the tests.....";
|
|
exit $SKIP_TEST;
|
|
fi;
|
|
|
|
return 0; # true
|
|
}
|
|
|
|
|
|
mount_fs ()
|
|
{
|
|
local NUM_MOUNT=0; # On how many places to mount on
|
|
local CUR_MOUNT=1;
|
|
FS_MOUNTED=0;
|
|
|
|
# Check if kernel has controllers enabled
|
|
if no_controllers
|
|
then
|
|
echo "Kernel has none of cpu/memory controllers enabled";
|
|
echo "Recompile your kernel with at least one of these enabled"
|
|
echo "Exiting the tests.....";
|
|
exit $SKIP_TEST;
|
|
fi;
|
|
|
|
# At least one Controller is enabled. So proceed further.
|
|
if [ -z $1 ]
|
|
then
|
|
echo "WARN: No parameter passed to function mount_fs";
|
|
echo "taking default as 0....So not mounting cgroup fs";
|
|
else
|
|
NUM_MOUNT=$1;
|
|
debug "mount_fs fs will be mounted on $NUM_MOUNT places";
|
|
fi;
|
|
|
|
# create so many directories i.e. mountpoints
|
|
while [ $NUM_MOUNT -ge $CUR_MOUNT ]
|
|
do
|
|
NEWTARGET="$TARGET-$CUR_MOUNT";
|
|
if [ -e $NEWTARGET ]
|
|
then
|
|
echo "WARN: $NEWTARGET already exist..overwriting";
|
|
check_mount_fs; # Possibly fs might be mounted on it
|
|
if [ $FS_MOUNTED -gt 0 ]
|
|
then
|
|
umount_fs;
|
|
else
|
|
rmdir $NEWTARGET ;
|
|
fi;
|
|
fi;
|
|
mkdir $NEWTARGET;
|
|
|
|
# In case of multimount, mount controllers at diff points
|
|
if $MULTIMOUNT ; then
|
|
if [ $CTLR1 ] && [ $CTLR2 ] ; then
|
|
if [ $CUR_MOUNT -eq 1 ] ; then
|
|
CONTROLLERS=$CTLR1;
|
|
else
|
|
CONTROLLERS=$CTLR2;
|
|
fi;
|
|
else
|
|
echo "Only 1 controler enabled in kernel";
|
|
echo "So not running multiple mount testcases";
|
|
exit $SKIP_TEST;
|
|
fi;
|
|
fi;
|
|
|
|
mount -t cgroup -o $CONTROLLERS cgroup $NEWTARGET;
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "ERROR: in mounting cgroup fs on $NEWTARGET."
|
|
echo "Exiting test";
|
|
umount_fs;
|
|
exit -1;
|
|
fi;
|
|
target[$CUR_MOUNT]=$NEWTARGET;
|
|
CUR_MOUNT=`expr $CUR_MOUNT + 1`;
|
|
FS_MOUNTED=`expr $FS_MOUNTED + 1`;
|
|
|
|
# Group created earlier may again be visible if not cleaned.
|
|
# So clean them all
|
|
if [ -e $NEWTARGET/group1 ] # first group that is created
|
|
then
|
|
# Need to handle if tasks are running in them
|
|
rmdir $NEWTARGET/group*
|
|
echo "WARN: Earlier groups found and removed...";
|
|
fi;
|
|
|
|
debug "$CONTROLLERS controllers mounted on $NEWTARGET directory"
|
|
done;
|
|
|
|
if [ $FS_MOUNTED -gt 2 ]
|
|
then
|
|
FS_MOUNTED=2;
|
|
fi;
|
|
|
|
}
|
|
|
|
get_ctl_num()
|
|
{
|
|
ctl1=$1;
|
|
ctl2=$2;
|
|
if [ -z $ctl1 ] || [ -z $ctl2 ]; then
|
|
echo "Null controller passed to function get_ctl_num"
|
|
echo "Exiting the testcases....."
|
|
fi
|
|
|
|
# Add any new controller developed here
|
|
declare -a ctl_list;
|
|
# Following list has to be in sync with enums in header
|
|
ctl_list[0]="cpu";
|
|
ctl_list[1]="memory";
|
|
ctl_list[2]="cpuset";
|
|
|
|
local i=0;
|
|
while [ ! -z ${ctl_list[$i]} ]; do
|
|
if [ "${ctl_list[$i]}" == "$ctl1" ]; then
|
|
ctl1=$i;
|
|
fi;
|
|
|
|
if [ "${ctl_list[$i]}" == "$ctl2" ]; then
|
|
ctl2=$i;
|
|
fi;
|
|
i=`expr $i + 1`;
|
|
done;
|
|
}
|
|
|
|
runtest()
|
|
{
|
|
MOUNT_INFO=$1;
|
|
TEST_EXEC=$2;
|
|
if [ -f $TEST_EXEC ]
|
|
then
|
|
./$TEST_EXEC $MOUNT_INFO $ctl1 $ctl2 ${target[1]} ${target[2]};
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo Error in running ./$TEST_EXEC
|
|
echo Exiting tests.
|
|
else
|
|
PID=$!;
|
|
fi;
|
|
else
|
|
echo Sources not compiled. please run make;
|
|
fi
|
|
}
|
|
|
|
###############################
|
|
# Main starts here
|
|
# Check if kernel has controllers support
|
|
if [ -e /proc/cgroups ]
|
|
then
|
|
get_all_controllers;
|
|
else
|
|
echo "Your Kernel seems to be too old. Plz recompile your"
|
|
echo "Kernel with cgroups and appropriate controllers enabled"
|
|
echo " Exiting the testcases...."
|
|
exit $SKIP_TEST;
|
|
fi;
|
|
|
|
MY_ID=`id -u`
|
|
if [ $MY_ID -ne 0 ]; then
|
|
echo "Only root can start this script."
|
|
echo " Exiting the testcase..."
|
|
exit $SKIP_TEST
|
|
fi
|
|
|
|
# TestSet01: Run tests without mounting cgroup filesystem
|
|
echo;
|
|
echo Running first set of testcases;
|
|
echo ==============================
|
|
FS_MOUNTED=0;
|
|
FILE=libcgrouptest01;
|
|
check_mount_fs;
|
|
# unmount fs if already mounted
|
|
if [ $FS_MOUNTED -ne 0 ]
|
|
then
|
|
umount_fs;
|
|
fi;
|
|
debug "FS_MOUNTED = $FS_MOUNTED"
|
|
runtest $FS_MOUNTED $FILE
|
|
|
|
wait $PID;
|
|
RC=$?;
|
|
if [ $RC -ne 0 ]
|
|
then
|
|
echo Test binary $FILE exited abnormaly with return value $RC;
|
|
# Do not exit here. Failure in this case does not imply
|
|
# failure in other cases also
|
|
RET=$RC
|
|
fi;
|
|
|
|
# TestSet02: Run tests with mounting cgroup filesystem
|
|
echo;
|
|
echo Running second set of testcases;
|
|
echo ==============================
|
|
FILE=libcgrouptest01;
|
|
check_mount_fs;
|
|
# mount fs at one point if not already mounted or multimounted
|
|
NUM_MOUNT=1;
|
|
if [ $FS_MOUNTED -eq 0 ]
|
|
then
|
|
mount_fs $NUM_MOUNT;
|
|
elif [ $FS_MOUNTED -gt 1 ]
|
|
then
|
|
umount_fs;
|
|
mount_fs $NUM_MOUNT;
|
|
fi;
|
|
debug "FS_MOUNTED = $FS_MOUNTED"
|
|
get_ctl_num $CTLR1 $CTLR2;
|
|
runtest $FS_MOUNTED $FILE
|
|
|
|
wait $PID;
|
|
RC=$?;
|
|
if [ $RC -ne 0 ]
|
|
then
|
|
echo Test binary $FILE exited abnormaly with return value $RC;
|
|
RET=$RC
|
|
fi;
|
|
umount_fs;
|
|
|
|
|
|
# TestSet03: Run tests with mounting cgroup filesystem at multiple points
|
|
echo;
|
|
echo Running third set of testcases;
|
|
echo ==============================
|
|
FILE=libcgrouptest01;
|
|
check_mount_fs;
|
|
# mount fs at multiple points
|
|
MULTIMOUNT=true;
|
|
NUM_MOUNT=2;
|
|
if [ $FS_MOUNTED -eq 0 ]
|
|
then
|
|
mount_fs $NUM_MOUNT;
|
|
elif [ $FS_MOUNTED -eq 1 ]
|
|
then
|
|
umount_fs;
|
|
mount_fs $NUM_MOUNT;
|
|
fi;
|
|
debug "FS_MOUNTED = $FS_MOUNTED"
|
|
get_ctl_num $CTLR1 $CTLR2;
|
|
runtest $FS_MOUNTED $FILE
|
|
|
|
wait $PID;
|
|
RC=$?;
|
|
if [ $RC -ne 0 ]
|
|
then
|
|
echo Test binary $FILE exited abnormaly with return value $RC;
|
|
RET=$RC
|
|
fi;
|
|
umount_fs;
|
|
|
|
exit $RET;
|