1#!/bin/sh 2 3################################################################################ 4## ## 5## Copyright (c) 2015 SUSE ## 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, but ## 13## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## 14## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## 15## 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 ## 20## USA ## 21## ## 22## Author: Cedric Hnyda <chnyda@suse.com> ## 23## ## 24################################################################################ 25 26# Usage 27# ./pids.sh caseno max 28# 29TST_CLEANUP=cleanup 30TST_SETUP=setup 31TST_TESTFUNC=do_test 32TST_POS_ARGS=2 33TST_USAGE=usage 34TST_NEEDS_ROOT=1 35 36. tst_test.sh 37 38caseno=$1 39max=$2 40mounted=1 41 42usage() 43{ 44 cat << EOF 45usage: $0 caseno max_processes 46 47caseno - testcase number from interval 1-5 48max_processes - maximal number of processes to attach 49 (applicable to testcase 1-4) 50OPTIONS 51EOF 52} 53 54cleanup() 55{ 56 killall -9 pids_task2 >/dev/null 2>&1 57 58 tst_res TINFO "removing created directories" 59 rmdir $testpath 60 if [ "$mounted" -ne "1" ]; then 61 tst_res TINFO "Umounting pids" 62 umount $mount_point 63 rmdir $mount_point 64 fi 65} 66 67setup() 68{ 69 exist=`grep -w pids /proc/cgroups | cut -f1`; 70 if [ "$exist" = "" ]; then 71 tst_brk TCONF NULL "pids not supported" 72 fi 73 74 mount_point=`grep -w pids /proc/mounts | cut -f 2 | cut -d " " -f2` 75 76 if [ "$mount_point" = "" ]; then 77 mounted=0 78 mount_point=/dev/cgroup 79 fi 80 81 testpath=$mount_point/ltp_$TCID 82 83 if [ "$mounted" -eq "0" ]; then 84 ROD mkdir -p $mount_point 85 ROD mount -t cgroup -o pids none $mount_point 86 fi 87 ROD mkdir -p $testpath 88} 89 90start_pids_tasks2() 91{ 92 nb=$1 93 for i in `seq 1 $nb`; do 94 pids_task2 & 95 echo $! > $testpath/tasks 96 done 97 98 if [ $(cat "$testpath/tasks" | wc -l) -ne $nb ]; then 99 tst_brk TBROK "failed to attach process" 100 fi 101} 102 103stop_pids_tasks() 104{ 105 for i in `cat $testpath/tasks`; do 106 ROD kill -9 $i 107 wait $i 108 done 109} 110 111case1() 112{ 113 start_pids_tasks2 $max 114 115 # should return 0 because there is no limit 116 pids_task1 "$testpath/tasks" 117 ret=$? 118 119 if [ "$ret" -eq "2" ]; then 120 tst_res TFAIL "fork failed unexpectedly" 121 elif [ "$ret" -eq "0" ]; then 122 tst_res TPASS "fork didn't fail" 123 else 124 tst_res TBROK "pids_task1 failed" 125 fi 126 127 stop_pids_tasks 128} 129 130case2() 131{ 132 tmp=$((max - 1)) 133 tst_res TINFO "limit the number of pid to $max" 134 ROD echo $max \> $testpath/pids.max 135 136 start_pids_tasks2 $tmp 137 138 # should return 2 because the limit of pids is reached 139 pids_task1 "$testpath/tasks" 140 ret=$? 141 142 if [ "$ret" -eq "2" ]; then 143 tst_res TPASS "fork failed as expected" 144 elif [ "$ret" -eq "0" ]; then 145 tst_res TFAIL "fork didn't fail despite the limit" 146 else 147 tst_res TBROK "pids_task1 failed" 148 fi 149 150 stop_pids_tasks 151} 152 153case3() 154{ 155 lim=$((max + 2)) 156 tst_res TINFO "limit the number of avalaible pid to $lim" 157 ROD echo $lim \> $testpath/pids.max 158 159 start_pids_tasks2 $max 160 161 pids_task1 "$testpath/tasks" 162 ret=$? 163 164 if [ "$ret" -eq "2" ]; then 165 tst_res TFAIL "fork failed unexpectedly" 166 elif [ "$ret" -eq "0" ]; then 167 tst_res TPASS "fork worked as expected" 168 else 169 tst_res TBROK "pids_task1 failed" 170 fi 171 172 stop_pids_tasks 173} 174 175case4() 176{ 177 tst_res TINFO "limit the number of avalaible pid to 0" 178 ROD echo 0 \> $testpath/pids.max 179 180 start_pids_tasks2 $max 181 182 tst_res TPASS "all process were attached" 183 184 stop_pids_tasks 185} 186 187case5() 188{ 189 tst_res TINFO "try to limit the number of avalaible pid to -1" 190 echo -1 > $testpath/pids.max 191 192 if [ "$?" -eq "0" ]; then 193 tst_res TFAIL "managed to set the limit to -1" 194 else 195 tst_res TPASS "didn't manage to set the limit to -1" 196 fi 197} 198 199do_test() 200{ 201 tst_res TINFO "Running testcase $caseno with $max processes" 202 case$caseno 203} 204 205tst_run 206