memcg_regression_test.sh revision 36670807662c06ba6d931560b0cfb8321ebd237f
1#! /bin/sh 2 3################################################################################ 4## ## 5## Copyright (c) 2009 FUJITSU LIMITED ## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## 20## ## 21## Author: Li Zefan <lizf@cn.fujitsu.com> ## 22## Added memcg enable/disable functinality: Rishikesh K Rajak ## 23## <risrajak@linux.vnet.ibm.com ## 24## ## 25################################################################################ 26 27cd $LTPROOT/testcases/bin 28 29export TCID="memcg_regression_test" 30export TST_TOTAL=4 31export TST_COUNT=1 32 33if [ "$USER" != root ]; then 34 tst_brkm TBROK ignored "Test must be run as root" 35 exit 0 36fi 37 38if [ ! "grep -w memory /proc/cgroups | cut -f4" == "1" ] 39then 40 echo "WARNING:"; 41 echo "Either Kernel does not support for memory resource controller or feature not enabled"; 42 echo "Skipping all memcgroup testcases...."; 43 exit 0 44fi 45 46tst_kvercmp 2 6 30 47if [ $? -eq 0 ]; then 48 tst_brkm TBROK ignored "Test should be run with kernel 2.6.30 or newer" 49 exit 0 50fi 51 52nr_bug=`dmesg | grep -c "kernel BUG"` 53nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` 54nr_warning=`dmesg | grep -c "^WARNING"` 55nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` 56 57# check_kernel_bug - check if some kind of kernel bug happened 58check_kernel_bug() 59{ 60 new_bug=`dmesg | grep -c "kernel BUG"` 61 new_null=`dmesg | grep -c "kernel NULL pointer dereference"` 62 new_warning=`dmesg | grep -c "^WARNING"` 63 new_lockdep=`dmesg | grep -c "possible recursive locking detected"` 64 65 # no kernel bug is detected 66 if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \ 67 $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then 68 return 1 69 fi 70 71 # some kernel bug is detected 72 if [ $new_bug -gt $nr_bug ]; then 73 tst_resm TFAIL "kernel BUG was detected!" 74 fi 75 if [ $new_warning -gt $nr_warning ]; then 76 tst_resm TFAIL "kernel WARNING was detected!" 77 fi 78 if [ $new_null -gt $nr_null ]; then 79 tst_resm "kernel NULL pointer dereference!" 80 fi 81 if [ $new_lockdep -gt $nr_lockdep ]; then 82 tst_resm "kernel lockdep warning was detected!" 83 fi 84 85 nr_bug=$new_bug 86 nr_null=$new_null 87 nr_warning=$new_warning 88 nr_lockdep=$new_lockdep 89 90 failed=1 91 return 0 92} 93 94#--------------------------------------------------------------------------- 95# Bug: The bug was, while forking mass processes, trigger memcgroup OOM, 96# then NULL pointer dereference may be hit. 97# Kernel: 2.6.25-rcX 98# Links: http://lkml.org/lkml/2008/4/14/38 99# Fix: commit e115f2d89253490fb2dbf304b627f8d908df26f1 100#--------------------------------------------------------------------------- 101test_1() 102{ 103 mkdir memcg/0/ 104 echo 0 > memcg/0/memory.limit_in_bytes 105 106 ./memcg_test_1 107 108 rmdir memcg/0/ 109 110 check_kernel_bug 111 if [ $? -eq 1 ]; then 112 tst_resm TPASS "no kernel bug was found" 113 fi 114} 115 116#--------------------------------------------------------------------------- 117# Bug: Shrink memory might never return, unless send signal to stop it. 118# Kernel: 2.6.29 119# Links: http://marc.info/?t=123199973900003&r=1&w=2 120# http://lkml.org/lkml/2009/2/3/72 121# Fix: 81d39c20f5ee2437d71709beb82597e2a38efbbc 122#--------------------------------------------------------------------------- 123test_2() 124{ 125 ./memcg_test_2 & 126 pid1=$! 127 sleep 1 128 129 mkdir memcg/0 130 echo $pid1 > memcg/0/tasks 131 132 # let pid1 'test_2' allocate memory 133 /bin/kill -SIGUSR1 $pid1 134 sleep 1 135 136 # shrink memory 137 echo 1 > memcg/0/memory.limit_in_bytes 2>&1 & 138 pid2=$! 139 140 # check if 'echo' will exit and exit with failure 141 for tmp in $(seq 0 4); do 142 sleep 1 143 ps -p $! > /dev/null 144 if [ $? -ne 0 ]; then 145 wait $pid2 146 if [ $? -eq 0 ]; then 147 tst_resm TFAIL "echo should return failure" 148 failed=1 149 kill -9 $pid1 $pid2 > /dev/null 2>&1 150 wait $pid1 $pid2 151 rmdir memcg/0 152 fi 153 break 154 fi 155 done 156 157 if [ $tmp -eq 5 ]; then 158 tst_resm TFAIL "'echo' doesn't exit!" 159 failed=1 160 else 161 tst_resm TPASS "EBUSY was returned as expected" 162 fi 163 164 kill -9 $pid1 $pid2 > /dev/null 2>&1 165 wait $pid1 $pid2 > /dev/null 2>&1 166 rmdir memcg/0 167} 168 169#--------------------------------------------------------------------------- 170# Bug: crash when rmdir a cgroup on IA64 171# Kernel: 2.6.29-rcX 172# Links: http://marc.info/?t=123235660300001&r=1&w=2 173# Fix: commit 299b4eaa302138426d5a9ecd954de1f565d76c94 174#--------------------------------------------------------------------------- 175test_3() 176{ 177 mkdir memcg/0 178 for pid in `cat memcg/tasks`; do 179 echo $pid > memcg/0/tasks 2> /dev/null 180 done 181 182 for pid in `cat memcg/0/tasks`; do 183 echo $pid > memcg/tasks 2> /dev/null 184 done 185 rmdir memcg/0 186 187 check_kernel_bug 188 if [ $? -eq 1 ]; then 189 tst_resm TPASS "no kernel bug was found" 190 fi 191} 192 193#--------------------------------------------------------------------------- 194# Bug: the memcg's refcnt handling at swapoff was wrong, causing crash 195# Kernel: 2.6.29-rcX 196# Links: http://marc.info/?t=123208656300004&r=1&w=2 197# Fix: commit 85d9fc89fb0f0703df6444f260187c088a8d59ff 198#--------------------------------------------------------------------------- 199test_4() 200{ 201 ./memcg_test_4.sh 202 203 check_kernel_bug 204 if [ $? -eq 1 ]; then 205 tst_resm TPASS "no kernel bug was found" 206 fi 207 208 # test_4.sh might be killed by oom, so do clean up here 209 killall -9 memcg_test_4 2> /dev/null 210 killall -9 memcg_test_4.sh 2> /dev/null 211 swapon -a 212} 213 214# main 215 216mkdir memcg/ 217 218for cur in $(seq 1 $TST_TOTAL); do 219 export TST_COUNT=$cur 220 221 mount -t cgroup -o memory xxx memcg/ 222 if [ $? -ne 0 ]; then 223 tst_resm TFAIL "failed to mount memory subsytem" 224 continue 225 fi 226 227 test_$cur 228 229 umount memcg/ 230done 231 232rmdir memcg/ 233 234exit $failed 235 236