#!/bin/bash # usage ./runcpuctl_latency_test.sh ############################################################################### # Copyright (c) International Business Machines Corp., 2008 # # # # 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 # # # ############################################################################### # Name Of File: run_cpuctl_test.sh # # # # Description: This file runs the setup for testing latency under heavy load # # when group scheduling is enabled # # After setup it runs diff test cases in diff setup. # # # # Test 01: Tests latency when no cgroup is mounted # # Test 02: Tests latency when cgroup is mounted # # # # # # Author: Sudhir Kumar # # # # History: # # # # DATE NAME EMAIL DESC # # # # 26/11/08 Sudhir Kumar Created this test # # # ############################################################################### NUM_TASKS=100; NUM_GROUPS=2; #for default check_task=""; declare -a pid; allowed_latency=10; export TCID="cpuctl_latency_test"; export TST_COUNT=1; export TST_TOTAL=2; . parameters.sh latency_cleanup() { local i; if [ -n "${pid[1]}" ]; then for i in $(seq 1 $NUM_TASKS) do kill -s SIGUSR1 ${pid[$i]} 2>/dev/null; done fi sleep 2; if [ $TEST_NUM -eq 2 ]; then # move any remaining task sleep 2; for task in `cat /dev/cpuctl/group*/tasks`; do echo $task > /dev/cpuctl/tasks #2>/dev/null 1>&2; done rmdir /dev/cpuctl/group* #2> /dev/null umount /dev/cpuctl #2> /dev/null rmdir /dev/cpuctl #2> /dev/null rm -f myfifo; fi; echo "Cleanup done for latency test $TEST_NUM" echo } log2() { local x=$1 n=2 l=-1; while((x));do let l+=1 let x/=n; done; return $l; } # There is no single criterion for max latency, so pass or fail is only # intuitive. Here we use the same logic as by the kernel calc_allowed_latency() { # default sched granularity=5ms if not exported by kernel def_gran=5000 #in microseconds if [ -f /proc/sys/kernel/sched_wakeup_granularity_ns ]; then sys_latency=`cat /proc/sys/kernel/sched_wakeup_granularity_ns` allowed_latency=`expr $sys_latency / 1000` # in microseconds else num_cpus=`tst_ncpus` log2 $num_cpus; ln_num_cpus=$? ln_num_cpus=`expr $ln_num_cpus + 1` allowed_latency=`expr $ln_num_cpus \* $def_gran` fi # To be more practical we will take our criterio as double of this value allowed_latency=`expr $allowed_latency \* 2` } PWD=`pwd` ################################ # Start ################################ TEST_NUM=$1; if [ -z $TEST_NUM ]; then echo "Invalid test no passed to test script" echo "Exiting the test..." exit 1; fi; cd $LTPROOT/testcases/bin/ #Bad idea???????? # Check if sources are compiled if [ ! -f $cpuctl_latency_test ] || [ ! -f $cpuctl_latency_check_task ] then echo "TBROK The sources are not compiled...." cd $PWD; exit 1; fi # Keep the signal handler ready trap 'echo "Doing cleanup"; latency_cleanup;' 0; # Calculate the alowed latency value calc_allowed_latency; case $TEST_NUM in "1") #without creating any groups # Run the load creating tasks echo TINFO "Running cpuctl Latency Test 1" for i in $(seq 1 $NUM_TASKS) do # Execute the load tasks ./cpuctl_latency_test $TEST_NUM & if [ $? -ne 0 ] then echo "TBROK Failed to execute binary" exit; else pid[$i]=$!; fi done # Run the latency checking task ./cpuctl_latency_check_task $TEST_NUM $$ $allowed_latency & if [ $? -ne 0 ] then echo "TBROK Failed to execute main binary" exit; else check_task=$!; fi; ;; "2") # With group scheduling echo TINFO "Running cpuctl Latency Test 2" NUM_CPUS=`tst_ncpus` get_num_groups; # NUM_GROUPS is set now do_setup; for num in $(seq 1 $NUM_TASKS) do group=/dev/cpuctl/group_`expr $num % $NUM_GROUPS + 1`; ./cpuctl_latency_test $TEST_NUM $group & if [ $? -ne 0 ] then echo "TBROK Failed to execute binary" exit; else pid[$num]=$!; fi; done; # Calculate the alowed latency value ./cpuctl_latency_check_task $TEST_NUM $$ $allowed_latency $group & if [ $? -ne 0 ] then echo "TBROK Failed to execute main binary"; exit; else check_task=$!; fi; ;; * ) # wrong test num echo TBROK "Invalid test number passed to the script" exit; ;; esac; wait $check_task; RC=$?; # Return status of the task being waited if [ $RC -ne 0 ] then echo "Task $check_task exited abnormaly with return value: $RC"; echo TBROK "Test could'nt execute for expected duration"; fi cd $PWD;