public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Subrata Modak <subrata@linux.vnet.ibm.com>
To: Shi Weihua <shiwh@cn.fujitsu.com>
Cc: Dhaval Giani <dhaval@linux.vnet.ibm.com>,
	ltp-list <ltp-list@lists.sourceforge.net>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Balbir Singh <balbir@in.ibm.com>
Subject: Re: [LTP] [PATCH] Add new testcases for memcgroup
Date: Mon, 14 Sep 2009 12:52:01 +0530	[thread overview]
Message-ID: <1252912921.6877.2.camel@subratamodak.linux.ibm.com> (raw)
In-Reply-To: <4AADCDC3.8000600@cn.fujitsu.com>

Hi Shi,

Thanks for re-posting the patch. I have added your tests to LTP. Thanks
for contributing again.

Regards--
Subrata

On Mon, 2009-09-14 at 12:59 +0800, Shi Weihua wrote:
> Subrata Modak wrote:
> > Hi Shi,
> > 
> > Thanks once again for contributing the Memcgroup functional and Stress
> > tests. Please find some of my comments below:
> > 
> > On Wed, 2009-09-09 at 12:27 +0800, Shi Weihua wrote:
> <snip>
> >> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/Makefile ltp-full-20090831.memcgroup/testcases/kernel/controllers/Makefile
> >> --- ltp-full-20090831.orig/testcases/kernel/controllers/Makefile	2009-09-07 18:14:49.000000000 -0400
> >> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/Makefile	2009-09-07 18:15:49.000000000 -0400
> >> @@ -17,6 +17,7 @@ SUBDIRS += cgroup_fj
> >>  SUBDIRS += cpuctl
> >>  SUBDIRS += cpuctl_fj
> >>  SUBDIRS += memctl
> >> +SUBDIRS += memcgroup
> > 
> > Is it necessary to create a separate sub-directory called 'memcgroup'
> > when 'memcg' already exists. Can you please merge your present tests
> > under some common directory like:
> > 
> >      1. move "controllers/memcg" to "controllers/memcg/regression",
> >      2. Create "controllers/memcg/functional", and
> >      3. Create "controllers/memcg/stress", to put the new tests,
> > 
> 
> Ok. Three directory was created in the latest version.
> 
> <snip>
> > 
> > which are not cleaned up even after the tests have completed execution.
> > This is making the tests fail when it is run again. So, please clean
> > this up:
> > 
> >      1. After normal test run,
> >      2. Check before the actual test run if it exists (if the earlier
> >         tests was abruptly terminated leaving these directories dirty),
> >         and cleanup before the tests begin,
> 
> Ok. A cleanup function has beed added in the latest version.
> 
> > 
> > Following is the test results for the new tests that you are proposing
> > to be added on my machine:
> > 
> > # uname -a
> > Linux 2.6.30-gcov #1 SMP Tue Aug 25 20:49:10 IST 2009 i686 i686 i386
> > GNU/Linux,
> > 
> > Please also find my comments inlined:
> > ==================================================================================================
> <snip>
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5712 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   14  TPASS  :  process 5712 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5721 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   15  TPASS  :  process 5721 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5733 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   16  TPASS  :  process 5733 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5744 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   17  TPASS  :  process 5744 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5755 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   18  TPASS  :  process 5755 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5765 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   19  TPASS  :  process 5765 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5774 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > memcgroup_function_test   20  TPASS  :  process 5774 is killed
> > /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 141:  5783 Killed                  $TEST_PATH/memcgroup_process $2 -s $3
> > 
> > *** ....<Can the above messages be appropriately handled ??>....
> 
> You meaned the message like as "***.sh: line xxx: (pid) Killed ***" should be deleted?
> But these messges are occured by the current running script, they can not be deleted. 
> Of course, the command like as "./memcgroup_function_test.sh > /dev/null" can delete 
> these messages, but the normal output (e.g. memcgroup_function_test   20  TPASS  :  process 5774 is killed)
> will be deleted too.
> 
> > 
> > memcgroup_function_test   21  TPASS  :  process 5783 is killed
> > memcgroup_function_test   22  TPASS  :  input=4095, limit_in_bytes=4096
> > memcgroup_function_test   23  TPASS  :  input=4097, limit_in_bytes=8192
> > memcgroup_function_test   24  TPASS  :  input=1, limit_in_bytes=4096
> > memcgroup_function_test   25  TFAIL  :  return value is 1
> > memcgroup_function_test   26  TPASS  :  return value is 1
> > memcgroup_function_test   27  TPASS  :  return value is 1
> > memcgroup_function_test   28  TPASS  :  return value is 1
> > memcgroup_function_test   29  TPASS  :  force memory succeeded
> > memcgroup_function_test   30  TPASS  :  force memory failed as expected
> > memcgroup_function_test   31  TPASS  :  return value is 0
> > memcgroup_function_test   32  TPASS  :  return value is 0
> > memcgroup_function_test   33  TPASS  :  return value is 0
> > memcgroup_function_test   34  TPASS  :  return value is 0
> > memcgroup_function_test   35  TPASS  :  return value is 1
> > memcgroup_function_test   36  TPASS  :  rss=4096/4096, cache=0/0
> > memcgroup_function_test   36  TPASS  :  rss=0/0, cache=0/0
> > memcgroup_function_test   37  TPASS  :  rss=4096/4096, cache=0/0
> > memcgroup_function_test   37  TPASS  :  rss=0/0, cache=0/0
> > memcgroup_function_test   38  TPASS  :  rss=4096/4096, cache=0/0
> > memcgroup_function_test   38  TPASS  :  rss=0/0, cache=0/0
> > 
> > *** ....<The numbering seems to be wrong here>....
> 
> It's correct. Some cases will output TPASS/TFAIL twice. Don't worry about it.
> 
> > 
> > <<<execution_status>>>
> > initiation_status="ok"
> > duration=110 termination_type=exited termination_id=1 corefile=no
> > cutime=29 cstime=268
> > <<<test_end>>>
> > <<<test_start>>>
> > tag=memcgroup_stress stime=1252484403
> > cmdline="      memcgroup_stress_test.sh"
> > contacts=""
> > analysis=exit
> > <<<test_output>>>
> > Wed Sep  9 13:50:07 IST 2009
> > incrementing stop
> > incrementing stop
> > <<<execution_status>>>
> > initiation_status="ok"
> > duration=265 termination_type=driver_interrupt termination_id=15
> > 
> > *** ....<The stress tests seems to be not executing at all. What can be
> > the reason behind the "driver_interrupt" ?? >....
> 
> Sorry, I can not reproduce your problem on my machine(x86).
> [root@F8-i386 ltp-full-20090831.memcg]# uname -a
> Linux F8-i386 2.6.31-rc5 #3 SMP Mon Aug 10 15:20:54 EDT 2009 i686 i686 i386 GNU/Linux
> 
> The latest version as following.
> 
> Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
> ---
>  runtest/controllers                                                    |    4
>  testcases/kernel/controllers/memcg/Makefile                            |   18
>  testcases/kernel/controllers/memcg/README                              |   42
>  testcases/kernel/controllers/memcg/functional/Makefile                 |   23
>  testcases/kernel/controllers/memcg/functional/memcg_function_test.sh   |  562 ++++++++++
>  testcases/kernel/controllers/memcg/functional/memcg_getpagesize.c      |   31
>  testcases/kernel/controllers/memcg/functional/memcg_process.c          |  319 +++++
>  testcases/kernel/controllers/memcg/memcg_regression_test.sh            |  225 ----
>  testcases/kernel/controllers/memcg/memcg_test_1.c                      |   71 -
>  testcases/kernel/controllers/memcg/memcg_test_2.c                      |   53
>  testcases/kernel/controllers/memcg/memcg_test_4.c                      |   62 -
>  testcases/kernel/controllers/memcg/memcg_test_4.sh                     |   48
>  testcases/kernel/controllers/memcg/regression/Makefile                 |   16
>  testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh |  225 ++++
>  testcases/kernel/controllers/memcg/regression/memcg_test_1.c           |   71 +
>  testcases/kernel/controllers/memcg/regression/memcg_test_2.c           |   53
>  testcases/kernel/controllers/memcg/regression/memcg_test_4.c           |   62 +
>  testcases/kernel/controllers/memcg/regression/memcg_test_4.sh          |   48
>  testcases/kernel/controllers/memcg/stress/Makefile                     |   23
>  testcases/kernel/controllers/memcg/stress/memcg_process_stress.c       |  109 +
>  testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh         |  125 ++
>  21 files changed, 1717 insertions(+), 473 deletions(-)
> 
> diff -urpN ltp-full-20090831.orig/runtest/controllers ltp-full-20090831.memcg/runtest/controllers
> --- ltp-full-20090831.orig/runtest/controllers	2009-08-31 01:15:37.000000000 -0400
> +++ ltp-full-20090831.memcg/runtest/controllers	2009-09-14 08:25:34.000000000 -0400
> @@ -1,5 +1,7 @@
>  #DESCRIPTION:Resource Management testing
>  cgroup		cgroup_regression_test.sh
> -memcg		memcg_regression_test.sh
> +memcg_regression	memcg_regression_test.sh
> +memcg_function		memcg_function_test.sh
> +memcg_stress		memcg_stress_test.sh
>  cgroup_fj	run_cgroup_test_fj.sh
>  controllers	test_controllers.sh
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/Makefile ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/Makefile
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/Makefile	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/Makefile	2009-09-11 11:05:53.000000000 -0400
> @@ -0,0 +1,23 @@
> +CFLAGS += -Wall -O2 -g -Wextra
> +LDLIBS += -lm
> +
> +SRCS=$(wildcard *.c)
> +OBJECTS=$(patsubst %.c,%.o,$(SRCS))
> +TARGETS=$(patsubst %.c,%,$(SRCS))
> +
> +all: $(TARGETS)
> +
> +$(TARGETS): %: %.o
> +
> +install:
> +	@set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../../bin/$$i ; chmod +x $$i ; done
> +
> +test:
> +	@./memcgroup_function_test.sh
> +
> +clean:
> +	rm -f $(TARGETS) $(OBJECTS)
> +
> +uninstall:
> +
> +.DEFAULT: ;
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_function_test.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_function_test.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_function_test.sh	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_function_test.sh	2009-09-11 13:12:57.000000000 -0400
> @@ -0,0 +1,562 @@
> +#! /bin/sh
> +
> +################################################################################
> +##                                                                            ##
> +## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> +##                                                                            ##
> +## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> +##                                                                            ##
> +## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> +## Restructure for LTP: Shi Weihua <shiwh@cn.fujitsu.com>                     ##
> +##                                                                            ##
> +################################################################################
> +
> +cd $LTPROOT/testcases/bin
> +export TCID="memcg_function_test"
> +export TST_TOTAL=38
> +export TST_COUNT=0
> +
> +grep -w memory /proc/cgroups 2>&1 > /dev/null
> +if [ $? -ne 0 ]; then
> +	echo "WARNING:";
> +	echo "Kernel does not support for memory resource controller";
> +	echo "Skipping all memcgroup testcases....";
> +	exit 0
> +fi
> +
> +TEST_PATH=$PWD
> +
> +PASS=0
> +FAIL=1
> +
> +PAGESIZE=`./memcg_getpagesize`
> +HUGEPAGESIZE=`grep Hugepagesize /proc/meminfo | awk '{ print $2 }'`
> +HUGEPAGESIZE=$(( $HUGEPAGESIZE * 1024 ))
> +
> +cur_id=0
> +failed=0
> +
> +# Record the test result of a test case
> +#
> +# $1 - The result of the test case, $PASS or $FAIL
> +# $2 - The output information
> +result()
> +{
> +	pass=$1
> +	info="$2"
> +
> +	if [ $pass -eq $PASS ]; then
> +		tst_resm TPASS "$info"
> +	else
> +		tst_resm TFAIL "$info"
> +		failed=$(( $failed + 1 ))
> +	fi
> +}
> +
> +# Check rss size and cache size from memory.stat
> +#
> +# $1 - Expected rss size
> +# $2 - Expected cache size
> +check_mem_stat()
> +{
> +	case $cur_id in
> +	"11"|"12"|"13")
> +		# result() will be called in test_failcnt(),not here
> +		return
> +		;;
> +	*)
> +		;;
> +	esac
> +
> +	rss=`cat memory.stat | grep rss | head -n 1 | cut -d " " -f 2`
> +	cache=`cat memory.stat | grep cache | head -n 1 | cut -d " " -f 2`
> +
> +	if [ "$1" = "$rss" ] && [ "$2" = "$cache" ] ; then
> +		pass=$PASS
> +	else
> +		pass=$FAIL
> +	fi
> +
> +	result $pass "rss=$rss/$1, cache=$cache/$2"
> +}
> +
> +# Run test cases which checks memory.stat after make
> +# some memory allocation
> +#
> +# $1 - the parameters of 'process', such as --shm
> +# $2 - the -s parameter of 'process', such as 4096
> +# $3 - the expected rss size
> +# $4 - the expected pagecache size
> +# $5 - check after free ?
> +test_mem_stat()
> +{
> +	$TEST_PATH/memcg_process $1 -s $2 &
> +	sleep 1
> +	echo $! > tasks
> +	/bin/kill -s SIGUSR1 $! 2> /dev/null
> +	sleep 1
> +
> +	check_mem_stat $3 $4
> +
> +	/bin/kill -s SIGUSR1 $! 2> /dev/null
> +	sleep 1
> +	if [ $5 -eq 1 ]; then
> +		check_mem_stat 0 0
> +	fi
> +	/bin/kill -s SIGINT $! 2> /dev/null
> +}
> +
> +# Test if memory.failcnt > 0, which means page reclamation
> +# occured
> +test_failcnt()
> +{
> +	failcnt=`cat memory.failcnt`
> +	if [ $failcnt -gt 0 ]; then
> +		pass=$PASS
> +	else
> +		pass=$FAIL
> +	fi
> +
> +	result $pass "failcnt=$failcnt"
> +}
> +
> +# Test process will be killed due to exceed memory limit
> +#
> +# $1 - the value of memory.limit_in_bytes
> +# $2 - the parameters of 'process', such as --shm
> +# $3 - the -s parameter of 'process', such as 4096
> +test_proc_kill()
> +{
> +	echo $1 > memory.limit_in_bytes
> +	$TEST_PATH/memcg_process $2 -s $3 &
> +	pid=$!
> +	sleep 1
> +	echo $pid > tasks
> +
> +	/bin/kill -s SIGUSR1 $pid 2> /dev/null
> +	sleep 1
> +	ps -p $pid > /dev/null 2> /dev/null
> +	if [ $? -ne 0 ]; then
> +		result $PASS "process $pid is killed"
> +	else
> +		/bin/kill -s SIGINT $pid 2> /dev/null
> +		result $FAIL "process $pid is not killed"
> +	fi
> +}
> +
> +# Test memory.limit_in_bytes will be aligned to PAGESIZE
> +#
> +# $1 - user input value
> +# $2 - expected value
> +test_limit_in_bytes()
> +{
> +	echo $1 > memory.limit_in_bytes
> +	limit=`cat memory.limit_in_bytes`
> +	if [ $limit -eq $2 ]; then
> +		result $PASS "input=$1, limit_in_bytes=$limit"
> +	else
> +		result $FAIL "input=$1, limit_in_bytes=$limit"
> +	fi
> +}
> +
> +# Test memory controller doesn't charge hugepage
> +#
> +# $1 - the value of /proc/sys/vm/nr_hugepages
> +# $2 - the parameters of 'process', --mmap-file or --shm
> +# $3 - the -s parameter of 'process', such as $HUGEPAGESIZE
> +# $4 - 0: expected failure, 1: expected success
> +test_hugepage()
> +{
> +	TMP_FILE=$TEST_PATH/tmp
> +	nr_hugepages=`cat /proc/sys/vm/nr_hugepages`
> +
> +	mkdir /hugetlb
> +	mount -t hugetlbfs none /hugetlb
> +
> +	echo $1 > /proc/sys/vm/nr_hugepages
> +
> +	$TEST_PATH/memcg_process $2 --hugepage -s $3 > $TMP_FILE 2>&1 &
> +	sleep 1
> +
> +	/bin/kill -s SIGUSR1 $! 2> /dev/null
> +	sleep 1
> +
> +	check_mem_stat 0 0
> +
> +	echo "TMP_FILE:"
> +	cat $TMP_FILE
> +
> +	if [ $4 -eq 0 ]; then
> +		test -s $TMP_FILE
> +		if [ $? -eq 0 ]; then
> +			result $PASS "allocate hugepage failed as expected"
> +		else
> +			/bin/kill -s SIGUSR1 $! 2> /dev/null
> +			/bin/kill -s SIGINT $! 2> /dev/null
> +			result $FAIL "allocate hugepage shoud fail"
> +		fi
> +	else
> +		test ! -s $TMP_FILE
> +		if [ $? -eq 0 ]; then
> +			/bin/kill -s SIGUSR1 $! 2> /dev/null
> +			/bin/kill -s SIGINT $! 2> /dev/null
> +			result $PASS "allocate hugepage succeeded"
> +		else
> +			result $FAIL "allocate hugepage failed"
> +		fi
> +	fi
> +
> +	sleep 1
> +	rm -rf $TMP_FILE
> +	umount /hugetlb
> +	rmdir /hugetlb
> +	echo $nr_hugepages > /proc/sys/vm/nr_hugepages
> +}
> +
> +# Test the memory charge won't move to subgroup
> +#
> +# $1 - memory.limit_in_bytes in parent group
> +# $2 - memory.limit_in_bytes in sub group
> +test_subgroup()
> +{
> +	mkdir subgroup
> +	echo $1 > memory.limit_in_bytes
> +	echo $2 > subgroup/memory.limit_in_bytes
> +
> +	$TEST_PATH/memcg_process --mmap-anon -s $PAGESIZE &
> +	sleep 1
> +	echo $! > tasks
> +	/bin/kill -s SIGUSR1 $! 2> /dev/null
> +	sleep 1
> +	check_mem_stat $PAGESIZE 0
> +
> +	cd subgroup
> +	echo $! > tasks
> +	check_mem_stat 0 0
> +
> +	# cleanup
> +	cd ..
> +	echo $! > tasks
> +	/bin/kill -s SIGINT $! 2> /dev/null
> +	sleep 1
> +	rmdir subgroup
> +}
> +
> +# Case 1 - 10: Test the management and counting of memory
> +testcase_1()
> +{
> +	test_mem_stat "--mmap-anon" $PAGESIZE $PAGESIZE 0 0
> +}
> +
> +testcase_2()
> +{
> +	test_mem_stat "--mmap-file" $PAGESIZE 0 $PAGESIZE 0
> +}
> +
> +testcase_3()
> +{
> +	test_mem_stat "--shm -k 3" $PAGESIZE 0 $PAGESIZE 0
> +}
> +
> +testcase_4()
> +{
> +	test_mem_stat "--mmap-anon --mmap-file --shm" $PAGESIZE \
> +		      $PAGESIZE $(($PAGESIZE*2)) 0
> +}
> +
> +testcase_5()
> +{
> +	test_mem_stat "--mmap-lock1" $PAGESIZE $PAGESIZE 0 0
> +}
> +
> +testcase_6()
> +{
> +	test_mem_stat "--mmap-anon" $PAGESIZE $PAGESIZE 0 1
> +}
> +
> +testcase_7()
> +{
> +	test_mem_stat "--mmap-file" $PAGESIZE 0 $PAGESIZE 1
> +}
> +
> +testcase_8()
> +{
> +	test_mem_stat "--shm -k 8" $PAGESIZE 0 $PAGESIZE 1
> +}
> +
> +testcase_9()
> +{
> +	test_mem_stat "--mmap-anon --mmap-file --shm" $PAGESIZE \
> +		      $PAGESIZE $(($PAGESIZE*2)) 1
> +}
> +
> +testcase_10()
> +{
> +	test_mem_stat "--mmap-lock1" $PAGESIZE $PAGESIZE 0 1
> +}
> +
> +# Case 11 - 13: Test memory.failcnt
> +testcase_11()
> +{
> +	echo $PAGESIZE > memory.limit_in_bytes
> +	test_mem_stat "--mmap-anon" $(($PAGESIZE*2)) $PAGESIZE 0 0
> +	test_failcnt
> +}
> +
> +testcase_12()
> +{
> +	echo $PAGESIZE > memory.limit_in_bytes
> +	test_mem_stat "--mmap-file" $(($PAGESIZE*2)) 0 $PAGESIZE 0
> +	test_failcnt
> +}
> +
> +testcase_13()
> +{
> +	echo $PAGESIZE > memory.limit_in_bytes
> +	test_mem_stat "--shm" $(($PAGESIZE*2)) 0 $PAGESIZE 0
> +	test_failcnt
> +}
> +
> +# Case 14 - 15: Test mmap(locked) + alloc_mem > limit_in_bytes
> +testcase_14()
> +{
> +	test_proc_kill $PAGESIZE "--mmap-lock1" $((PAGESIZE*2))
> +}
> +
> +testcase_15()
> +{
> +	test_proc_kill $PAGESIZE "--mmap-lock2" $((PAGESIZE*2))
> +}
> +
> +# Case 16 - 18: Test swapoff + alloc_mem > limi_in_bytes
> +testcase_16()
> +{
> +	swapoff -a
> +	test_proc_kill $PAGESIZE "--mmap-anon" $((PAGESIZE*2))
> +	swapon -a
> +}
> +
> +testcase_17()
> +{
> +	swapoff -a
> +	test_proc_kill $PAGESIZE "--mmap-file" $((PAGESIZE*2))
> +	swapon -a
> +}
> +
> +testcase_18()
> +{
> +	swapoff -a
> +	test_proc_kill $PAGESIZE "--shm -k 18" $((PAGESIZE*2))
> +	swapon -a
> +}
> +
> +# Case 19 - 21: Test limit_in_bytes == 0
> +testcase_19()
> +{
> +	test_proc_kill 0 "--mmap-anon" $PAGESIZE
> +}
> +
> +testcase_20()
> +{
> +	test_proc_kill 0 "--mmap-file" $PAGESIZE
> +}
> +
> +testcase_21()
> +{
> +	test_proc_kill 0 "--shm -k 21" $PAGESIZE
> +}
> +
> +# Case 22 - 24: Test limit_in_bytes will be aligned to PAGESIZE
> +testcase_22()
> +{
> +	test_limit_in_bytes $((PAGESIZE-1)) $PAGESIZE
> +}
> +
> +testcase_23()
> +{
> +	test_limit_in_bytes $((PAGESIZE+1)) $((PAGESIZE*2))
> +}
> +
> +testcase_24()
> +{
> +	test_limit_in_bytes 1 $PAGESIZE
> +}
> +
> +# Case 25 - 28: Test invaild memory.limit_in_bytes
> +testcase_25()
> +{
> +	echo -1 > memory.limit_in_bytes 2> /dev/null
> +#	result $(( !($? != 0) ))  "return value is $?"  //lizf
> +	result $(( !($? == 0) ))  "return value is $?"
> +}
> +
> +testcase_26()
> +{
> +	echo 1.0 > memory.limit_in_bytes 2> /dev/null
> +	result $(( !($? != 0) )) "return value is $?"
> +}
> +
> +testcase_27()
> +{
> +	echo 1xx > memory.limit_in_bytes 2> /dev/null
> +	result $(( !($? != 0) )) "return value is $?"
> +}
> +
> +testcase_28()
> +{
> +	echo xx > memory.limit_in_bytes 2> /dev/null
> +	result $(( !($? != 0) )) "return value is $?"
> +}
> +
> +# Case 29 - 35: Test memory.force_empty
> +testcase_29()
> +{
> +	$TEST_PATH/memcg_process --mmap-anon -s $PAGESIZE &
> +	pid=$!
> +	sleep 1
> +	echo $pid > tasks
> +	/bin/kill -s SIGUSR1 $pid 2> /dev/null
> +	sleep 1
> +	echo $pid > ../tasks
> +
> +	echo 1 > memory.force_empty
> +	if [ $? -eq 0 ]; then
> +		result $PASS "force memory succeeded"
> +	else
> +		result $FAIL "force memory failed"
> +	fi
> +
> +	/bin/kill -s SIGINT $pid 2> /dev/null
> +}
> +
> +testcase_30()
> +{
> +	$TEST_PATH/memcg_process --mmap-anon -s $PAGESIZE &
> +	pid=$!
> +	sleep 1
> +	echo $pid > tasks
> +	/bin/kill -s SIGUSR1 $pid 2> /dev/null
> +	sleep 1
> +
> +	echo 1 > memory.force_empty 2> /dev/null
> +	if [ $? -ne 0 ]; then
> +		result $PASS "force memory failed as expected"
> +	else
> +		result $FAIL "force memory should fail"
> +	fi
> +
> +	/bin/kill -s SIGINT $pid 2> /dev/null
> +}
> +
> +testcase_31()
> +{
> +	echo 0 > memory.force_empty 2> /dev/null
> +	result $? "return value is $?"
> +}
> +
> +testcase_32()
> +{
> +	echo 1.0 > memory.force_empty 2> /dev/null
> +	result $? "return value is $?"
> +}
> +
> +testcase_33()
> +{
> +	echo 1xx > memory.force_empty 2> /dev/null
> +	result $? "return value is $?"
> +}
> +
> +testcase_34()
> +{
> +	echo xx > memory.force_empty 2> /dev/null
> +	result $? "return value is $?"
> +}
> +
> +testcase_35()
> +{
> +	# writing to non-empty top mem cgroup's force_empty
> +	# should return failure
> +	echo 1 > /memcg/memory.force_empty 2> /dev/null
> +	result $(( $? )) "return value is $?"
> +}
> +
> +# Case 36 - 38: Test that group and subgroup have no relationship
> +testcase_36()
> +{
> +	test_subgroup $PAGESIZE $((2*PAGESIZE))
> +}
> +
> +testcase_37()
> +{
> +	test_subgroup $PAGESIZE $PAGESIZE
> +}
> +
> +testcase_38()
> +{
> +	test_subgroup $PAGESIZE 0
> +}
> +
> +shmmax=`cat /proc/sys/kernel/shmmax`
> +if [ $shmmax -lt $HUGEPAGESIZE ]; then
> +	echo $(($HUGEPAGESIZE)) > /proc/sys/kernel/shmmax
> +fi
> +
> +cleanup()
> +{
> +	if [ -e /dev/memcg ]; then
> +		umount /dev/memcg 2>/dev/null
> +		rmdir /dev/memcg 2>/dev/null
> +	fi
> +}
> +
> +
> +do_mount()
> +{
> +	cleanup;
> +
> +	mkdir /dev/memcg 2> /dev/null
> +	mount -t cgroup -omemory memcg /dev/memcg
> +}
> +
> +# Run all the test cases
> +for ((i = 1; i <= $TST_TOTAL; i++))
> +{
> +	export TST_COUNT=$(( $TST_COUNT + 1 ))
> +	cur_id=$i
> +
> +	do_mount;
> +
> +	# prepare
> +	mkdir /dev/memcg/$i 2> /dev/null
> +	cd /dev/memcg/$i
> +
> +	# run the case
> +	testcase_$i
> +
> +	# clean up
> +	sleep 1
> +	cd $TEST_PATH
> +	rmdir /dev/memcg/$i
> +
> +	cleanup;
> +}
> +
> +echo $shmmax > /proc/sys/kernel/shmmax
> +
> +if [ $failed -ne 0 ]; then
> +	exit 1
> +else
> +	exit 0
> +fi
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_getpagesize.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_getpagesize.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_getpagesize.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_getpagesize.c	2009-09-11 10:55:14.000000000 -0400
> @@ -0,0 +1,31 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <unistd.h>
> +#include <stdio.h>
> +
> +int main(void)
> +{
> +	printf("%d\n", getpagesize());
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_process.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_process.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/functional/memcg_process.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/functional/memcg_process.c	2009-09-11 10:55:14.000000000 -0400
> @@ -0,0 +1,319 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <signal.h>
> +#include <err.h>
> +#include <limits.h>
> +#include <getopt.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <sys/mman.h>
> +#include <sys/shm.h>
> +
> +int fd;
> +
> +int flag_exit;
> +int flag_allocated;
> +
> +int opt_mmap_anon;
> +int opt_mmap_file;
> +int opt_mmap_lock1;
> +int opt_mmap_lock2;
> +int opt_shm;
> +int opt_hugepage;
> +
> +int key_id;		/* used with opt_shm */
> +unsigned long memsize;
> +
> +#define FILE_HUGEPAGE	"/hugetlb/hugepagefile"
> +
> +#define MMAP_ANON	(SCHAR_MAX + 1)
> +#define MMAP_FILE	(SCHAR_MAX + 2)
> +#define MMAP_LOCK1	(SCHAR_MAX + 3)
> +#define MMAP_LOCK2	(SCHAR_MAX + 4)
> +#define SHM		(SCHAR_MAX + 5)
> +#define HUGEPAGE	(SCHAR_MAX + 6)
> +
> +const struct option long_opts[] = {
> +	{ "mmap-anon",	0, NULL, MMAP_ANON	},
> +	{ "mmap-file",	0, NULL, MMAP_FILE	},
> +	{ "mmap-lock1",	0, NULL, MMAP_LOCK1	},
> +	{ "mmap-lock2",	0, NULL, MMAP_LOCK2	},
> +	{ "shm",	0, NULL, SHM		},
> +	{ "hugepage",	0, NULL, HUGEPAGE	},
> +	{ "size",	1, NULL, 's'		},
> +	{ "key",	1, NULL, 'k'		},
> +	{ NULL,		0, NULL, 0		},
> +};
> +
> +/*
> + * process_options: read options from user input
> + */
> +void process_options(int argc, char *argv[])
> +{
> +	int c;
> +	char *end;
> +
> +	while (1) {
> +		c = getopt_long(argc, argv, "s:k:", long_opts, NULL);
> +		if (c == -1)
> +			break;
> +
> +		switch (c) {
> +		case 's':
> +			memsize = strtoul(optarg, &end, 10);
> +			if (*end != '\0')
> +				errx(1, "wrong -s argument!");
> +			break;
> +		case 'k':
> +			key_id = atoi(optarg);
> +			break;
> +		case MMAP_ANON:
> +			opt_mmap_anon = 1;
> +			break;
> +		case MMAP_FILE:
> +			opt_mmap_file = 1;
> +			break;
> +		case MMAP_LOCK1:
> +			opt_mmap_lock1 = 1;
> +			break;
> +		case MMAP_LOCK2:
> +			opt_mmap_lock2 = 1;
> +			break;
> +		case SHM:
> +			opt_shm = 1;
> +			break;
> +		case HUGEPAGE:
> +			opt_hugepage = 1;
> +			break;
> +		default:
> +			errx(1, "unknown option!\n");
> +			break;
> +		}
> +	}
> +}
> +
> +/*
> + * touch_memory: force allocating phy memory
> + */
> +void touch_memory(char *p, int size)
> +{
> +	int i;
> +	int pagesize = getpagesize();
> +
> +	for (i = 0; i < size; i += pagesize)
> +		p[i] = 0xef;
> +}
> +
> +void mmap_anon()
> +{
> +	static char *p;
> +
> +	if (!flag_allocated) {
> +		p = mmap(NULL, memsize, PROT_WRITE | PROT_READ,
> +			 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> +		if (p == MAP_FAILED)
> +			err(1, "mmap(anonymous) failed");
> +		touch_memory(p, memsize);
> +	} else {
> +		if (munmap(p, memsize) == -1)
> +			err(1, "munmap(anonymous) failed");
> +	}
> +}
> +
> +void mmap_file()
> +{
> +	static char *p;
> +	static int fd_hugepage;
> +	int fd_tmp;
> +
> +	if (!flag_allocated) {
> +		if (opt_hugepage) {
> +			fd_hugepage = open(FILE_HUGEPAGE,
> +					   O_CREAT | O_RDWR, 0755);
> +			if (fd_hugepage < 0)
> +				err(1, "open hugepage file failed");
> +			fd_tmp = fd_hugepage;
> +		} else
> +			fd_tmp = fd;
> +
> +		p = mmap(NULL, memsize, PROT_WRITE | PROT_READ,
> +			 MAP_SHARED, fd_tmp, 0);
> +		if (p == MAP_FAILED) {
> +			if (opt_hugepage)
> +				unlink(FILE_HUGEPAGE);
> +			err(1, "mmap(file) failed");
> +		}
> +		touch_memory(p, memsize);
> +	} else {
> +		if (!munmap(p, memsize) == -1)
> +			err(1, "munmap(file) failed");
> +
> +		if (opt_hugepage) {
> +			close(fd_hugepage);
> +			unlink(FILE_HUGEPAGE);
> +		}
> +	}
> +}
> +
> +void mmap_lock1()
> +{
> +	static char *p;
> +
> +	if (!flag_allocated) {
> +		p = mmap(NULL, memsize, PROT_WRITE | PROT_READ,
> +			 MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED, 0, 0);
> +		if (p == MAP_FAILED)
> +			err(1, "mmap(lock) failed");
> +	} else {
> +		if (munmap(p, memsize) == -1)
> +			err(1, "munmap(lock) failed");
> +	}
> +}
> +
> +void mmap_lock2()
> +{
> +	static char *p;
> +
> +	if (!flag_allocated) {
> +		p = mmap(NULL, memsize, PROT_WRITE | PROT_READ,
> +			 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> +		if (p == MAP_FAILED)
> +			err(1, "mmap failed");
> +
> +		if (!mlock(p, memsize))
> +			err(1, "mlock failed");
> +	} else {
> +		if (!munmap(p, memsize) == -1)
> +			err(1, "munmap failed");
> +	}
> +}
> +
> +void shm()
> +{
> +	static char *p;
> +	static int shmid;
> +	unsigned long flag;
> +
> +	key_t key;
> +
> +	if (!flag_allocated) {
> +		flag = IPC_CREAT | SHM_R | SHM_W;
> +		if (opt_hugepage)
> +			flag |= SHM_HUGETLB;
> +
> +		key = ftok("/dev/null", key_id);
> +		if (key == -1)
> +			err(1, "ftok() failed\n");
> +
> +		shmid = shmget(key, memsize, flag);
> +		if (shmid == -1)
> +			err(1, "shmget() failed\n");
> +		shmctl(shmid, IPC_RMID, NULL);
> +
> +		shmid = shmget(key, memsize, flag);
> +		if (shmid == -1)
> +			err(1, "shmget() failed\n");
> +
> +		p = shmat(shmid, NULL, 0);
> +		if (p == (void *)-1) {
> +			shmctl(shmid, IPC_RMID, NULL);
> +			err(1, "shmat() failed\n");
> +		}
> +		touch_memory(p, memsize);
> +	} else {
> +		if (shmdt(p) == -1)
> +			err(1, "shmdt() failed\n");
> +		if (shmctl(shmid, IPC_RMID, NULL) == -1)
> +			err(1, "shmctl() failed\n");
> +	}
> +}
> +
> +/*
> + * sigint_handler: handle SIGINT by set the exit flag.
> + */
> +void sigint_handler(int __attribute__((unused)) signo)
> +{
> +	flag_exit = 1;
> +}
> +
> +/*
> + * sigusr_handler: handler SIGUSR
> + *
> + * When we receive SIGUSR, we allocate some memory according
> + * to the user input when the process started.
> + *
> + * When we receive SIGUSR again, we will free all the allocated
> + * memory.
> + */
> +void sigusr_handler(int __attribute__((unused)) signo)
> +{
> +	if (opt_mmap_anon)
> +		mmap_anon();
> +
> +	if (opt_mmap_file)
> +		mmap_file();
> +
> +	if (opt_mmap_lock1)
> +		mmap_lock1();
> +
> +	if (opt_mmap_lock2)
> +		mmap_lock2();
> +
> +	if (opt_shm)
> +		shm();
> +
> +	flag_allocated = !flag_allocated;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	struct sigaction sigint_action;
> +	struct sigaction sigusr_action;
> +
> +	fd = open("/dev/zero", O_RDWR);
> +	if (fd < 0)
> +		err(1, "open /dev/zero failed");
> +
> +	memset(&sigint_action, 0, sizeof(sigint_action));
> +	sigint_action.sa_handler = &sigint_handler;
> +	sigaction(SIGINT, &sigint_action, NULL);
> +
> +	memset(&sigusr_action, 0, sizeof(sigusr_action));
> +	sigusr_action.sa_handler = &sigusr_handler;
> +	sigaction(SIGUSR1, &sigusr_action, NULL);
> +
> +	process_options(argc, argv);
> +
> +	while (!flag_exit)
> +		sleep(1);
> +
> +	close(fd);
> +
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/Makefile ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/Makefile
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/Makefile	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/Makefile	2009-09-14 08:16:31.000000000 -0400
> @@ -1,16 +1,10 @@
> -CFLAGS += -Wall
> -CPPFLAGS += -I../../../../include -I../libcontrollers
> -LDLIBS += -L../../../../lib/ -lltp
> +SUBDIRS = functional regression stress
> 
> -SRCS    = $(wildcard *.c)
> -
> -TARGETS = $(patsubst %.c,%,$(SRCS))
> -
> -all:    $(TARGETS)
> -
> -clean:
> -	rm -f $(TARGETS) *.o
> +all:
> +	@set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i ; done
> 
>  install:
> -	@set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../bin/$$i ; chmod +x $$i ; done
> +	@set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done
> 
> +clean:
> +	@set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_regression_test.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_regression_test.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_regression_test.sh	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_regression_test.sh	1969-12-31 19:00:00.000000000 -0500
> @@ -1,225 +0,0 @@
> -#! /bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> -##                                                                            ##
> -## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> -##                                                                            ##
> -## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> -##                                                                            ##
> -################################################################################
> -
> -cd $LTPROOT/testcases/bin
> -
> -export TCID="memcg_regression_test"
> -export TST_TOTAL=4
> -export TST_COUNT=1
> -
> -if [ "$USER" != root ]; then
> -	tst_brkm TBROK ignored "Test must be run as root"
> -	exit 0
> -fi
> -
> -tst_kvercmp 2 6 30
> -if [ $? -eq 0 ]; then
> -	tst_brkm TBROK ignored "Test should be run with kernel 2.6.30 or newer"
> -	exit 0
> -fi
> -
> -nr_bug=`dmesg | grep -c "kernel BUG"`
> -nr_null=`dmesg | grep -c "kernel NULL pointer dereference"`
> -nr_warning=`dmesg | grep -c "^WARNING"`
> -nr_lockdep=`dmesg | grep -c "possible recursive locking detected"`
> -
> -# check_kernel_bug - check if some kind of kernel bug happened
> -check_kernel_bug()
> -{
> -	new_bug=`dmesg | grep -c "kernel BUG"`
> -	new_null=`dmesg | grep -c "kernel NULL pointer dereference"`
> -	new_warning=`dmesg | grep -c "^WARNING"`
> -	new_lockdep=`dmesg | grep -c "possible recursive locking detected"`
> -
> -	# no kernel bug is detected
> -	if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \
> -	     $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then
> -		return 1
> -	fi
> -
> -	# some kernel bug is detected
> -	if [ $new_bug -gt $nr_bug ]; then
> -		tst_resm TFAIL "kernel BUG was detected!"
> -	fi
> -	if [ $new_warning -gt $nr_warning ]; then
> -		tst_resm TFAIL "kernel WARNING was detected!"
> -	fi
> -	if [ $new_null -gt $nr_null ]; then
> -		tst_resm "kernel NULL pointer dereference!"
> -	fi
> -	if [ $new_lockdep -gt $nr_lockdep ]; then
> -		tst_resm "kernel lockdep warning was detected!"
> -	fi
> -
> -	nr_bug=$new_bug
> -	nr_null=$new_null
> -	nr_warning=$new_warning
> -	nr_lockdep=$new_lockdep
> -
> -	failed=1
> -	return 0
> -}
> -
> -#---------------------------------------------------------------------------
> -# Bug:    The bug was, while forking mass processes, trigger memcgroup OOM,
> -#         then NULL pointer dereference may be hit.
> -# Kernel: 2.6.25-rcX
> -# Links:  http://lkml.org/lkml/2008/4/14/38
> -# Fix:    commit e115f2d89253490fb2dbf304b627f8d908df26f1
> -#---------------------------------------------------------------------------
> -test_1()
> -{
> -	mkdir memcg/0/
> -	echo 0 > memcg/0/memory.limit_in_bytes
> -
> -	./memcg_test_1
> -
> -	rmdir memcg/0/
> -
> -	check_kernel_bug
> -	if [ $? -eq 1 ]; then
> -		tst_resm TPASS "no kernel bug was found"
> -	fi
> -}
> -
> -#---------------------------------------------------------------------------
> -# Bug:    Shrink memory might never return, unless send signal to stop it.
> -# Kernel: 2.6.29
> -# Links:  http://marc.info/?t=123199973900003&r=1&w=2
> -#         http://lkml.org/lkml/2009/2/3/72
> -# Fix:    81d39c20f5ee2437d71709beb82597e2a38efbbc
> -#---------------------------------------------------------------------------
> -test_2()
> -{
> -	./memcg_test_2 &
> -	pid1=$!
> -	sleep 1
> -
> -	mkdir memcg/0
> -	echo $pid1 > memcg/0/tasks
> -
> -	# let pid1 'test_2' allocate memory
> -	/bin/kill -SIGUSR1 $pid1
> -	sleep 1
> -
> -	# shrink memory
> -	echo 1 > memcg/0/memory.limit_in_bytes 2>&1 &
> -	pid2=$!
> -
> -	# check if 'echo' will exit and exit with failure
> -	for tmp in $(seq 0 4); do
> -		sleep 1
> -		ps -p $! > /dev/null
> -		if [ $? -ne 0 ]; then
> -			wait $pid2
> -			if [ $? -eq 0 ]; then
> -				tst_resm TFAIL "echo should return failure"
> -				failed=1
> -				kill -9 $pid1 $pid2 > /dev/null 2>&1
> -				wait $pid1 $pid2
> -				rmdir memcg/0
> -			fi
> -			break
> -		fi
> -	done
> -
> -	if [ $tmp -eq 5 ]; then
> -		tst_resm TFAIL "'echo' doesn't exit!"
> -		failed=1
> -	else
> -		tst_resm TPASS "EBUSY was returned as expected"
> -	fi
> -
> -	kill -9 $pid1 $pid2 > /dev/null 2>&1
> -	wait $pid1 $pid2 > /dev/null 2>&1
> -	rmdir memcg/0
> -}
> -
> -#---------------------------------------------------------------------------
> -# Bug:    crash when rmdir a cgroup on IA64
> -# Kernel: 2.6.29-rcX
> -# Links:  http://marc.info/?t=123235660300001&r=1&w=2
> -# Fix:    commit 299b4eaa302138426d5a9ecd954de1f565d76c94
> -#---------------------------------------------------------------------------
> -test_3()
> -{
> -	mkdir memcg/0
> -	for pid in `cat memcg/tasks`; do
> -		echo $pid > memcg/0/tasks 2> /dev/null
> -	done
> -
> -	for pid in `cat memcg/0/tasks`; do
> -		echo $pid > memcg/tasks 2> /dev/null
> -	done
> -	rmdir memcg/0
> -
> -	check_kernel_bug
> -	if [ $? -eq 1 ]; then
> -		tst_resm TPASS "no kernel bug was found"
> -	fi
> -}
> -
> -#---------------------------------------------------------------------------
> -# Bug:    the memcg's refcnt handling at swapoff was wrong, causing crash
> -# Kernel: 2.6.29-rcX
> -# Links:  http://marc.info/?t=123208656300004&r=1&w=2
> -# Fix:    commit 85d9fc89fb0f0703df6444f260187c088a8d59ff
> -#---------------------------------------------------------------------------
> -test_4()
> -{
> -	./memcg_test_4.sh
> -
> -	check_kernel_bug
> -	if [ $? -eq 1 ]; then
> -		tst_resm TPASS "no kernel bug was found"
> -	fi
> -
> -	# test_4.sh might be killed by oom, so do clean up here
> -	killall -9 memcg_test_4 2> /dev/null
> -	killall -9 memcg_test_4.sh 2> /dev/null
> -	swapon -a
> -}
> -
> -# main
> -
> -mkdir memcg/
> -
> -for cur in $(seq 1 $TST_TOTAL); do
> -	export TST_COUNT=$cur
> -
> -	mount -t cgroup -o memory xxx memcg/
> -	if [ $? -ne 0 ]; then
> -		tst_resm TFAIL "failed to mount memory subsytem"
> -		continue
> -	fi
> -
> -	test_$cur
> -
> -	umount memcg/
> -done
> -
> -rmdir memcg/
> -
> -exit $failed
> -
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_1.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_1.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_1.c	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_1.c	1969-12-31 19:00:00.000000000 -0500
> @@ -1,71 +0,0 @@
> -/******************************************************************************/
> -/*                                                                            */
> -/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> -/*                                                                            */
> -/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> -/*                                                                            */
> -/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> -/*                                                                            */
> -/******************************************************************************/
> -
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <fcntl.h>
> -#include <sys/mman.h>
> -#include <sys/wait.h>
> -
> -#define MAP_FLAGS	(MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED)
> -
> -#define LOOP		40
> -
> -int main(void)
> -{
> -	char buf[10];
> -	int i;
> -	int loop;
> -	int pid;
> -	int size = getpagesize();
> -	int fd = open("memcg/0/tasks", O_WRONLY);
> -
> -	if (fd < 0)
> -		return 1;
> -
> -	for (loop = 0; loop < LOOP; loop++) {
> -		for (i = 0; i < 10; i++) {
> -			pid = fork();
> -			if (pid == 0) {
> -				char *p;
> -
> -				sprintf(buf, "%d", getpid());
> -				write(fd, buf, 10);
> -				fsync(fd);
> -
> -				p = mmap(NULL, size, PROT_READ | PROT_WRITE,
> -					 MAP_FLAGS, 0, 0);
> -
> -				return 0;
> -			}
> -		}
> -
> -		for (i = 0; i < 10; i++)
> -			wait(NULL);
> -	}
> -
> -	close(fd);
> -
> -	return 0;
> -}
> -
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_2.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_2.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_2.c	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_2.c	1969-12-31 19:00:00.000000000 -0500
> @@ -1,53 +0,0 @@
> -/******************************************************************************/
> -/*                                                                            */
> -/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> -/*                                                                            */
> -/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> -/*                                                                            */
> -/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> -/*                                                                            */
> -/******************************************************************************/
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <sys/mman.h>
> -#include <signal.h>
> -
> -void sigusr_handler(int __attribute__((unused)) signo)
> -{
> -	char *p;
> -	int size = getpagesize() * 2;
> -
> -	p = mmap(NULL, size, PROT_READ | PROT_WRITE,
> -		 MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED, 0, 0);
> -	if (p == MAP_FAILED)
> -		exit(1);
> -}
> -
> -int main(void)
> -{
> -	struct sigaction sigusr_action;
> -
> -	memset(&sigusr_action, 0, sizeof(sigusr_action));
> -	sigusr_action.sa_handler = &sigusr_handler;
> -	sigaction(SIGUSR1, &sigusr_action, NULL);
> -
> -	while (1)
> -		sleep(1);
> -
> -	return 0;
> -}
> -
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_4.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_4.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_4.c	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_4.c	1969-12-31 19:00:00.000000000 -0500
> @@ -1,62 +0,0 @@
> -/******************************************************************************/
> -/*                                                                            */
> -/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> -/*                                                                            */
> -/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> -/*                                                                            */
> -/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> -/*                                                                            */
> -/******************************************************************************/
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <signal.h>
> -#include <sys/mman.h>
> -
> -#define MEM_SIZE	(1024 * 1024 * 100)
> -
> -void sigusr_handler(int __attribute__((unused)) signo)
> -{
> -	char *p;
> -	int i;
> -	int pagesize = getpagesize();
> -
> -	p = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE,
> -		 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> -	if (p == MAP_FAILED) {
> -		fprintf(stderr, "failed to allocate memory!\n");
> -		exit(1);
> -	}
> -
> -	for (i = 0; i < MEM_SIZE; i += pagesize)
> -		p[i] = 'z';
> -}
> -
> -int main(void)
> -{
> -	struct sigaction sigusr_action;
> -
> -	memset(&sigusr_action, 0, sizeof(sigusr_action));
> -	sigusr_action.sa_handler = &sigusr_handler;
> -	sigaction(SIGUSR1, &sigusr_action, NULL);
> -
> -	while (1)
> -		sleep(1);
> -
> -	return 0;
> -}
> -
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_4.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_4.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/memcg_test_4.sh	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/memcg_test_4.sh	1969-12-31 19:00:00.000000000 -0500
> @@ -1,48 +0,0 @@
> -#! /bin/sh
> -
> -################################################################################
> -##                                                                            ##
> -## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> -##                                                                            ##
> -## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> -##                                                                            ##
> -## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> -##                                                                            ##
> -################################################################################
> -
> -# attach current task to memcg/0/
> -mkdir memcg/0
> -echo $$ > memcg/0/tasks
> -
> -./memcg_test_4 &
> -pid=$!
> -sleep 1
> -
> -# let $pid allocate 100M memory
> -/bin/kill -SIGUSR1 $pid
> -sleep 1
> -
> -# shrink memory, and then 80M will be swapped
> -echo 40M > memcg/0/memory.limit_in_bytes
> -
> -# turn off swap, and swapoff will be killed
> -swapoff -a
> -sleep 1
> -echo $pid > memcg/tasks 2> /dev/null
> -echo $$ > memcg/tasks 2> /dev/null
> -
> -# now remove the cgroup
> -rmdir memcg/0
> -
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/README ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/README
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/README	2009-08-31 01:15:54.000000000 -0400
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/README	2009-09-11 11:15:35.000000000 -0400
> @@ -3,7 +3,47 @@ TEST SUITE:
>  The directory memcg contains the tests related to memory resource controller.
>  Those testcases can reproduce bugs we found.
> 
> +There are total 44 testcases that have been added. These testcases
> +contain the regression test, basis operation test and stress test of memctl.
> +
> +NOTE: the test can be run by root only.
> +
>  TESTS AIM:
> 
> -The aim of the tests is to track any future regressions.
> +The aim of the tests is to track any future regressions, test the functionality
> +of memctl..
> +
> +FILES DESCRIPTION:
> +
> +functional/memcgroup_function_test.sh
> +--------------------
> +This script runs all the 38 testcases of basis operation.
> +
> +functional/memcgroup_getpagesize.c
> +--------------------
> +The program gets page size through getpagesize().
> +
> +functional/memcgroup_process.c
> +--------------------
> +The program allocates some memory according to the user input when received SIGUSR.
> +And, it frees all the allocated when received SIGUSR again.
> +
> +stress/memcgroup_stress_test.sh
> +--------------------
> +This script runs all the 2 testcases of stress test.
> +
> +stress/memcgroup_process_stress.c
> +--------------------
> +The program allocates some memory in a specified time period when received SIGUSR. 
> +
> +regression/memcg_regression_test.sh
> +--------------------
> +This script runs all the 4 testcases of regression test.
> +
> +regression/memcg_test_*.c/sh
> +--------------------
> +The programs run each regression test.
> 
> +README
> +------
> +The one you have gone through.
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/Makefile ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/Makefile
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/Makefile	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/Makefile	2009-09-11 11:05:40.000000000 -0400
> @@ -0,0 +1,16 @@
> +CFLAGS += -Wall
> +CPPFLAGS += -I../../../../../include -I../../libcontrollers
> +LDLIBS += -L../../../../../lib/ -lltp
> +
> +SRCS    = $(wildcard *.c)
> +
> +TARGETS = $(patsubst %.c,%,$(SRCS))
> +
> +all:    $(TARGETS)
> +
> +clean:
> +	rm -f $(TARGETS) *.o
> +
> +install:
> +	@set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../../bin/$$i ; chmod +x $$i ; done
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_regression_test.sh	2009-08-31 01:15:54.000000000 -0400
> @@ -0,0 +1,225 @@
> +#! /bin/sh
> +
> +################################################################################
> +##                                                                            ##
> +## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> +##                                                                            ##
> +## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> +##                                                                            ##
> +## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> +##                                                                            ##
> +################################################################################
> +
> +cd $LTPROOT/testcases/bin
> +
> +export TCID="memcg_regression_test"
> +export TST_TOTAL=4
> +export TST_COUNT=1
> +
> +if [ "$USER" != root ]; then
> +	tst_brkm TBROK ignored "Test must be run as root"
> +	exit 0
> +fi
> +
> +tst_kvercmp 2 6 30
> +if [ $? -eq 0 ]; then
> +	tst_brkm TBROK ignored "Test should be run with kernel 2.6.30 or newer"
> +	exit 0
> +fi
> +
> +nr_bug=`dmesg | grep -c "kernel BUG"`
> +nr_null=`dmesg | grep -c "kernel NULL pointer dereference"`
> +nr_warning=`dmesg | grep -c "^WARNING"`
> +nr_lockdep=`dmesg | grep -c "possible recursive locking detected"`
> +
> +# check_kernel_bug - check if some kind of kernel bug happened
> +check_kernel_bug()
> +{
> +	new_bug=`dmesg | grep -c "kernel BUG"`
> +	new_null=`dmesg | grep -c "kernel NULL pointer dereference"`
> +	new_warning=`dmesg | grep -c "^WARNING"`
> +	new_lockdep=`dmesg | grep -c "possible recursive locking detected"`
> +
> +	# no kernel bug is detected
> +	if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \
> +	     $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then
> +		return 1
> +	fi
> +
> +	# some kernel bug is detected
> +	if [ $new_bug -gt $nr_bug ]; then
> +		tst_resm TFAIL "kernel BUG was detected!"
> +	fi
> +	if [ $new_warning -gt $nr_warning ]; then
> +		tst_resm TFAIL "kernel WARNING was detected!"
> +	fi
> +	if [ $new_null -gt $nr_null ]; then
> +		tst_resm "kernel NULL pointer dereference!"
> +	fi
> +	if [ $new_lockdep -gt $nr_lockdep ]; then
> +		tst_resm "kernel lockdep warning was detected!"
> +	fi
> +
> +	nr_bug=$new_bug
> +	nr_null=$new_null
> +	nr_warning=$new_warning
> +	nr_lockdep=$new_lockdep
> +
> +	failed=1
> +	return 0
> +}
> +
> +#---------------------------------------------------------------------------
> +# Bug:    The bug was, while forking mass processes, trigger memcgroup OOM,
> +#         then NULL pointer dereference may be hit.
> +# Kernel: 2.6.25-rcX
> +# Links:  http://lkml.org/lkml/2008/4/14/38
> +# Fix:    commit e115f2d89253490fb2dbf304b627f8d908df26f1
> +#---------------------------------------------------------------------------
> +test_1()
> +{
> +	mkdir memcg/0/
> +	echo 0 > memcg/0/memory.limit_in_bytes
> +
> +	./memcg_test_1
> +
> +	rmdir memcg/0/
> +
> +	check_kernel_bug
> +	if [ $? -eq 1 ]; then
> +		tst_resm TPASS "no kernel bug was found"
> +	fi
> +}
> +
> +#---------------------------------------------------------------------------
> +# Bug:    Shrink memory might never return, unless send signal to stop it.
> +# Kernel: 2.6.29
> +# Links:  http://marc.info/?t=123199973900003&r=1&w=2
> +#         http://lkml.org/lkml/2009/2/3/72
> +# Fix:    81d39c20f5ee2437d71709beb82597e2a38efbbc
> +#---------------------------------------------------------------------------
> +test_2()
> +{
> +	./memcg_test_2 &
> +	pid1=$!
> +	sleep 1
> +
> +	mkdir memcg/0
> +	echo $pid1 > memcg/0/tasks
> +
> +	# let pid1 'test_2' allocate memory
> +	/bin/kill -SIGUSR1 $pid1
> +	sleep 1
> +
> +	# shrink memory
> +	echo 1 > memcg/0/memory.limit_in_bytes 2>&1 &
> +	pid2=$!
> +
> +	# check if 'echo' will exit and exit with failure
> +	for tmp in $(seq 0 4); do
> +		sleep 1
> +		ps -p $! > /dev/null
> +		if [ $? -ne 0 ]; then
> +			wait $pid2
> +			if [ $? -eq 0 ]; then
> +				tst_resm TFAIL "echo should return failure"
> +				failed=1
> +				kill -9 $pid1 $pid2 > /dev/null 2>&1
> +				wait $pid1 $pid2
> +				rmdir memcg/0
> +			fi
> +			break
> +		fi
> +	done
> +
> +	if [ $tmp -eq 5 ]; then
> +		tst_resm TFAIL "'echo' doesn't exit!"
> +		failed=1
> +	else
> +		tst_resm TPASS "EBUSY was returned as expected"
> +	fi
> +
> +	kill -9 $pid1 $pid2 > /dev/null 2>&1
> +	wait $pid1 $pid2 > /dev/null 2>&1
> +	rmdir memcg/0
> +}
> +
> +#---------------------------------------------------------------------------
> +# Bug:    crash when rmdir a cgroup on IA64
> +# Kernel: 2.6.29-rcX
> +# Links:  http://marc.info/?t=123235660300001&r=1&w=2
> +# Fix:    commit 299b4eaa302138426d5a9ecd954de1f565d76c94
> +#---------------------------------------------------------------------------
> +test_3()
> +{
> +	mkdir memcg/0
> +	for pid in `cat memcg/tasks`; do
> +		echo $pid > memcg/0/tasks 2> /dev/null
> +	done
> +
> +	for pid in `cat memcg/0/tasks`; do
> +		echo $pid > memcg/tasks 2> /dev/null
> +	done
> +	rmdir memcg/0
> +
> +	check_kernel_bug
> +	if [ $? -eq 1 ]; then
> +		tst_resm TPASS "no kernel bug was found"
> +	fi
> +}
> +
> +#---------------------------------------------------------------------------
> +# Bug:    the memcg's refcnt handling at swapoff was wrong, causing crash
> +# Kernel: 2.6.29-rcX
> +# Links:  http://marc.info/?t=123208656300004&r=1&w=2
> +# Fix:    commit 85d9fc89fb0f0703df6444f260187c088a8d59ff
> +#---------------------------------------------------------------------------
> +test_4()
> +{
> +	./memcg_test_4.sh
> +
> +	check_kernel_bug
> +	if [ $? -eq 1 ]; then
> +		tst_resm TPASS "no kernel bug was found"
> +	fi
> +
> +	# test_4.sh might be killed by oom, so do clean up here
> +	killall -9 memcg_test_4 2> /dev/null
> +	killall -9 memcg_test_4.sh 2> /dev/null
> +	swapon -a
> +}
> +
> +# main
> +
> +mkdir memcg/
> +
> +for cur in $(seq 1 $TST_TOTAL); do
> +	export TST_COUNT=$cur
> +
> +	mount -t cgroup -o memory xxx memcg/
> +	if [ $? -ne 0 ]; then
> +		tst_resm TFAIL "failed to mount memory subsytem"
> +		continue
> +	fi
> +
> +	test_$cur
> +
> +	umount memcg/
> +done
> +
> +rmdir memcg/
> +
> +exit $failed
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_1.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_1.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_1.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_1.c	2009-08-31 01:15:54.000000000 -0400
> @@ -0,0 +1,71 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/mman.h>
> +#include <sys/wait.h>
> +
> +#define MAP_FLAGS	(MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED)
> +
> +#define LOOP		40
> +
> +int main(void)
> +{
> +	char buf[10];
> +	int i;
> +	int loop;
> +	int pid;
> +	int size = getpagesize();
> +	int fd = open("memcg/0/tasks", O_WRONLY);
> +
> +	if (fd < 0)
> +		return 1;
> +
> +	for (loop = 0; loop < LOOP; loop++) {
> +		for (i = 0; i < 10; i++) {
> +			pid = fork();
> +			if (pid == 0) {
> +				char *p;
> +
> +				sprintf(buf, "%d", getpid());
> +				write(fd, buf, 10);
> +				fsync(fd);
> +
> +				p = mmap(NULL, size, PROT_READ | PROT_WRITE,
> +					 MAP_FLAGS, 0, 0);
> +
> +				return 0;
> +			}
> +		}
> +
> +		for (i = 0; i < 10; i++)
> +			wait(NULL);
> +	}
> +
> +	close(fd);
> +
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_2.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_2.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_2.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_2.c	2009-08-31 01:15:54.000000000 -0400
> @@ -0,0 +1,53 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/mman.h>
> +#include <signal.h>
> +
> +void sigusr_handler(int __attribute__((unused)) signo)
> +{
> +	char *p;
> +	int size = getpagesize() * 2;
> +
> +	p = mmap(NULL, size, PROT_READ | PROT_WRITE,
> +		 MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED, 0, 0);
> +	if (p == MAP_FAILED)
> +		exit(1);
> +}
> +
> +int main(void)
> +{
> +	struct sigaction sigusr_action;
> +
> +	memset(&sigusr_action, 0, sizeof(sigusr_action));
> +	sigusr_action.sa_handler = &sigusr_handler;
> +	sigaction(SIGUSR1, &sigusr_action, NULL);
> +
> +	while (1)
> +		sleep(1);
> +
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_4.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_4.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_4.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_4.c	2009-08-31 01:15:54.000000000 -0400
> @@ -0,0 +1,62 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <signal.h>
> +#include <sys/mman.h>
> +
> +#define MEM_SIZE	(1024 * 1024 * 100)
> +
> +void sigusr_handler(int __attribute__((unused)) signo)
> +{
> +	char *p;
> +	int i;
> +	int pagesize = getpagesize();
> +
> +	p = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE,
> +		 MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> +	if (p == MAP_FAILED) {
> +		fprintf(stderr, "failed to allocate memory!\n");
> +		exit(1);
> +	}
> +
> +	for (i = 0; i < MEM_SIZE; i += pagesize)
> +		p[i] = 'z';
> +}
> +
> +int main(void)
> +{
> +	struct sigaction sigusr_action;
> +
> +	memset(&sigusr_action, 0, sizeof(sigusr_action));
> +	sigusr_action.sa_handler = &sigusr_handler;
> +	sigaction(SIGUSR1, &sigusr_action, NULL);
> +
> +	while (1)
> +		sleep(1);
> +
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/regression/memcg_test_4.sh	2009-08-31 01:15:54.000000000 -0400
> @@ -0,0 +1,48 @@
> +#! /bin/sh
> +
> +################################################################################
> +##                                                                            ##
> +## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> +##                                                                            ##
> +## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> +##                                                                            ##
> +## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> +##                                                                            ##
> +################################################################################
> +
> +# attach current task to memcg/0/
> +mkdir memcg/0
> +echo $$ > memcg/0/tasks
> +
> +./memcg_test_4 &
> +pid=$!
> +sleep 1
> +
> +# let $pid allocate 100M memory
> +/bin/kill -SIGUSR1 $pid
> +sleep 1
> +
> +# shrink memory, and then 80M will be swapped
> +echo 40M > memcg/0/memory.limit_in_bytes
> +
> +# turn off swap, and swapoff will be killed
> +swapoff -a
> +sleep 1
> +echo $pid > memcg/tasks 2> /dev/null
> +echo $$ > memcg/tasks 2> /dev/null
> +
> +# now remove the cgroup
> +rmdir memcg/0
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/Makefile ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/Makefile
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/Makefile	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/Makefile	2009-09-11 11:06:05.000000000 -0400
> @@ -0,0 +1,23 @@
> +CFLAGS += -Wall -O2 -g -Wextra
> +LDLIBS += -lm
> +
> +SRCS=$(wildcard *.c)
> +OBJECTS=$(patsubst %.c,%.o,$(SRCS))
> +TARGETS=$(patsubst %.c,%,$(SRCS))
> +
> +all: $(TARGETS)
> +
> +$(TARGETS): %: %.o
> +
> +install:
> +	@set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../../bin/$$i ; chmod +x $$i ; done
> +
> +test:
> +	@./memcgroup_stress_test.sh
> +
> +clean:
> +	rm -f $(TARGETS) $(OBJECTS)
> +
> +uninstall:
> +
> +.DEFAULT: ;
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/memcg_process_stress.c ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/memcg_process_stress.c
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/memcg_process_stress.c	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/memcg_process_stress.c	2009-09-11 10:55:14.000000000 -0400
> @@ -0,0 +1,109 @@
> +/******************************************************************************/
> +/*                                                                            */
> +/* Copyright (c) 2009 FUJITSU LIMITED                                         */
> +/*                                                                            */
> +/* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
> +/*                                                                            */
> +/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
> +/*                                                                            */
> +/******************************************************************************/
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <signal.h>
> +#include <string.h>
> +#include <err.h>
> +#include <math.h>
> +#include <sys/mman.h>
> +
> +int flag_exit;
> +int flag_ready;
> +
> +int interval;
> +unsigned long memsize;
> +
> +char **pages;
> +int nr_page;
> +
> +void touch_memory()
> +{
> +	int i;
> +
> +	for (i = 0; i < nr_page; i++)
> +		pages[i][0] = 0xef;
> +}
> +
> +void sigusr_handler(int __attribute__((unused)) signo)
> +{
> +	int i;
> +	int pagesize = getpagesize();
> +
> +	nr_page = ceil((double)memsize / pagesize);
> +
> +	pages = calloc(nr_page, sizeof(char *));
> +	if (pages == NULL)
> +		errx(1, "calloc() failed");
> +
> +	for (i = 0; i < nr_page; i++) {
> +		pages[i] = mmap(NULL, pagesize, PROT_WRITE | PROT_READ,
> +				MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
> +		if (pages[i] == MAP_FAILED)
> +			err(1, "map() failed\n");
> +	}
> +
> +	flag_ready = 1;
> +}
> +
> +void sigint_handler(int __attribute__((unused)) signo)
> +{
> +	flag_exit = 1;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	char *end;
> +	struct sigaction sigint_action;
> +	struct sigaction sigusr_action;
> +
> +	if (argc != 3)
> +		errx(1, "Wrong argument num");
> +
> +	memsize = strtoul(argv[1], &end, 10);
> +	if (*end != '\0')
> +		errx(1, "wrong memsize");
> +	memsize = memsize * 1024 * 1024;
> +
> +	interval = atoi(argv[2]);
> +	if (interval <= 0)
> +		interval = 1;
> +
> +	memset(&sigint_action, 0, sizeof(sigint_action));
> +	sigint_action.sa_handler = &sigint_handler;
> +	sigaction(SIGINT, &sigint_action, NULL);
> +
> +	memset(&sigusr_action, 0, sizeof(sigusr_action));
> +	sigusr_action.sa_handler = &sigusr_handler;
> +	sigaction(SIGUSR1, &sigusr_action, NULL);
> +
> +	while (!flag_exit) {
> +		sleep(interval);
> +
> +		if (flag_ready)
> +			touch_memory();
> +	};
> +
> +	return 0;
> +}
> +
> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh
> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh	1969-12-31 19:00:00.000000000 -0500
> +++ ltp-full-20090831.memcg/testcases/kernel/controllers/memcg/stress/memcg_stress_test.sh	2009-09-12 12:26:12.000000000 -0400
> @@ -0,0 +1,125 @@
> +#! /bin/sh
> +
> +################################################################################
> +##                                                                            ##
> +## Copyright (c) 2009 FUJITSU LIMITED                                         ##
> +##                                                                            ##
> +## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
> +##                                                                            ##
> +## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
> +## Restructure for LTP: Shi Weihua <shiwh@cn.fujitsu.com>                     ##
> +##                                                                            ##
> +################################################################################
> +
> +cd $LTPROOT/testcases/bin
> +export TCID="memcg_stress_test"
> +export TST_TOTAL=2
> +export TST_COUNT=0
> +
> +grep -w memory /proc/cgroups 2>&1 > /dev/null
> +if [ $? -ne 0 ]; then
> +	echo "WARNING:";
> +	echo "Kernel does not support for memory resource controller";
> +	echo "Skipping all memcgroup testcases....";
> +	exit 0
> +fi
> +
> +RUN_TIME=$(( 60 * 60 ))
> +
> +cleanup()
> +{
> +	if [ -e /dev/memcg ]; then
> +		umount /dev/memcg 2>/dev/null
> +		rmdir /dev/memcg 2>/dev/null
> +	fi
> +}
> +
> +
> +do_mount()
> +{
> +	cleanup;
> +
> +	mkdir /dev/memcg 2> /dev/null
> +	mount -t cgroup -omemory memcg /dev/memcg
> +}
> +
> +
> +# Run the stress test
> +#
> +# $1 - Number of cgroups
> +# $2 - Allocated how much memory in one process? in MB
> +# $3 - The interval to touch memory in a process
> +# $4 - How long does this test run ? in second
> +run_stress()
> +{
> +	do_mount;
> +
> +	for ((i = 0; i < $1; i++))
> +	{
> +		mkdir /memcg/$i 2> /dev/null
> +		./memcg_process_stress $2 $3 &
> +		pid[$i]=$!
> +
> +		echo ${pid[$i]} > /memcg/$i/tasks
> +	}
> +
> +	for ((i = 0; i < $1; i++))
> +	{
> +		/bin/kill -s SIGUSR1 ${pid[$i]} 2> /dev/null
> +	}
> +
> +	sleep $4
> +
> +	for ((i = 0; i < $1; i++))
> +	{
> +		/bin/kill -s SIGINT ${pid[$i]} 2> /dev/null
> +		wait ${pid[$i]}
> +
> +		rmdir /memcg/$i 2> /dev/null
> +	}
> +
> +	cleanup;
> +}
> +
> +testcase_1()
> +{
> +	run_stress 150 $(( ($mem-150) / 150 )) 10 $RUN_TIME
> +
> +	tst_resm TPASS "stress test 1 passed"
> +}
> +
> +testcase_2()
> +{
> +	run_stress 1 $mem 10 $RUN_TIME
> +
> +	tst_resm TPASS "stress test 2 passed"
> +}
> +
> +echo 3 > /proc/sys/vm/drop_caches
> +sleep 2
> +mem_free=`cat /proc/meminfo | grep MemFree | awk '{ print $2 }'`
> +swap_free=`cat /proc/meminfo | grep SwapFree | awk '{ print $2 }'`
> +
> +mem=$(( $mem_free + $swap_free / 2 ))
> +mem=$(( mem / 1024 ))
> +
> +date
> +export TST_COUNT=$(( $TST_COUNT + 1 ))
> +testcase_1
> +export TST_COUNT=$(( $TST_COUNT + 1 ))
> +testcase_2
> +date
> +
> +exit 0


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

      reply	other threads:[~2009-09-14  7:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-09  4:27 [LTP] [PATCH] Add new testcases for memcgroup Shi Weihua
2009-09-09  7:58 ` Subrata Modak
2009-09-13 13:16   ` Subrata Modak
2009-09-13 23:41     ` Shi Weihua
2009-09-14  4:59   ` Shi Weihua
2009-09-14  7:22     ` Subrata Modak [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1252912921.6877.2.camel@subratamodak.linux.ibm.com \
    --to=subrata@linux.vnet.ibm.com \
    --cc=balbir@in.ibm.com \
    --cc=dhaval@linux.vnet.ibm.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=shiwh@cn.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox