Home | History | Annotate | Download | only in cpuctl
      1 #!/bin/bash
      2 # usage ./parameters.sh
      3 
      4 #################################################################################
      5 #  Copyright (c) International Business Machines  Corp., 2007                   #
      6 #                                                                               #
      7 #  This program is free software;  you can redistribute it and/or modify        #
      8 #  it under the terms of the GNU General Public License as published by         #
      9 #  the Free Software Foundation; either version 2 of the License, or            #
     10 #  (at your option) any later version.                                          #
     11 #                                                                               #
     12 #  This program is distributed in the hope that it will be useful,              #
     13 #  but WITHOUT ANY WARRANTY;  without even the implied warranty of              #
     14 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                    #
     15 #  the GNU General Public License for more details.                             #
     16 #                                                                               #
     17 #  You should have received a copy of the GNU General Public License            #
     18 #  along with this program;  if not, write to the Free Software                 #
     19 #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA      #
     20 #                                                                               #
     21 #################################################################################
     22 # Name Of File: parameters.sh                                                   #
     23 #                                                                               #
     24 # Description: 	This file has functions for the setup for testing cpucontroller #
     25 #               setup includes creating controller device, mounting it with     #
     26 #               cgroup filesystem with option cpu and creating groups in it.    #
     27 #                                                                               #
     28 # Functions:    get_num_groups(): decides number of groups based on num of cpus	#
     29 #               setup(): creaes /dev/cpuctl, mounts cgroup fs on it, creates 	#
     30 #               groups in that, creates fifo to fire tasks at one time.         #
     31 #               cleanup(): Does full system cleanup                             #
     32 #                                                                               #
     33 # Author:       Sudhir Kumar   <skumar (at] linux.vnet.ibm.com>                      #
     34 #                                                                               #
     35 # History:                                                                      #
     36 #                                                                               #
     37 #  DATE         NAME           EMAIL                         DESC               #
     38 #                                                                               #
     39 #  20/12/07  Sudhir Kumar <skumar (at] linux.vnet.ibm.com>   Created this test       #
     40 #                                                                               #
     41 #################################################################################
     42 
     43 
     44 set_def_group() #default group spinning a task to create ideal scenario
     45 {
     46 	[ -d /dev/cpuctl/group_def ] || mkdir /dev/cpuctl/group_def;
     47 	if [ $? -ne 0 ]
     48 	then
     49 		echo "ERROR: Can't create default group... "
     50 			"Check your permissions..Exiting test";
     51 		cleanup;
     52 		exit -1;
     53 	fi
     54 	# Migrate all the running tasks to this group
     55 	# rt tasks require a finite value to cpu.rt_runtime_us
     56 	echo 10000 > /dev/cpuctl/group_def/cpu.rt_runtime_us;
     57 	for task in `cat /dev/cpuctl/tasks`; do
     58 		echo $task > /dev/cpuctl/group_def/tasks 2>/dev/null 1>&2;
     59 	done
     60 }
     61 
     62 get_num_groups()        # Number of tasks should be >= number of cpu's (to check scheduling fairness)
     63 {
     64         NUM_GROUPS=$(( (NUM_CPUS*3 + 1)/2 ))
     65 }
     66 
     67 	# Write the cleanup function
     68 cleanup ()
     69 {
     70         echo "Cleanup called";
     71 	killall cpuctl_def_task01 1>/dev/null 2>&1;
     72 	killall cpuctl_def_task02 1>/dev/null 2>&1;
     73 	killall cpuctl_task_* 1>/dev/null 2>&1;
     74 	sleep 1
     75         rm -f cpuctl_task_* 2>/dev/null
     76 	for task in `cat /dev/cpuctl/group_def/tasks`; do
     77 		echo $task > /dev/cpuctl/tasks 2>/dev/null 1>&2;
     78 	done
     79         rmdir /dev/cpuctl/group* 2> /dev/null
     80         umount /dev/cpuctl 2> /dev/null
     81         rmdir /dev/cpuctl 2> /dev/null
     82         rm -f myfifo 2>/dev/null
     83 
     84 }
     85         # Create /dev/cpuctl &  mount the cgroup file system with cpu controller
     86         #clean any group created eralier (if any)
     87 
     88 do_setup ()
     89 {
     90         if [ -e /dev/cpuctl ]
     91         then
     92                 echo "WARN:/dev/cpuctl already exist..overwriting"; # or a warning ?
     93                 cleanup;
     94                 mkdir /dev/cpuctl;
     95         else
     96                 mkdir /dev/cpuctl
     97         fi
     98         mount -t cgroup -ocpu cgroup /dev/cpuctl 2> /dev/null
     99         if [ $? -ne 0 ]
    100         then
    101                 echo "ERROR: Could not mount cgroup filesystem on /dev/cpuctl..Exiting test";
    102                 cleanup;
    103                 exit -1;
    104         fi
    105 
    106         # Group created earlier may again be visible if not cleaned properly...so clean them
    107 	groups=/dev/cpuctl/group*
    108         if [ -z "$groups" ]
    109         then
    110                 rmdir /dev/cpuctl/group*
    111                 echo "WARN: Earlier groups found and removed...";
    112         fi
    113 
    114         #Create a fifo to make all tasks wait on it
    115         mkfifo myfifo 2> /dev/null;
    116         if [ $? -ne 0 ]
    117         then
    118                 echo "ERROR: Can't create fifo...Check your permissions..Exiting test";
    119                 cleanup;
    120                 exit -1;
    121         fi
    122 
    123         # Create different groups
    124         for i in $(seq 1 $NUM_GROUPS)
    125         do
    126                 group=group_$i;
    127                 mkdir /dev/cpuctl/$group;# 2>/dev/null
    128                 if [ $? -ne 0 ]
    129                 then
    130                         echo "ERROR: Can't create $group...Check your permissions..Exiting test";
    131                         cleanup;
    132                         exit -1;
    133                 fi
    134         done
    135 }
    136 
    137