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