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