public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Shi Weihua <shiwh@cn.fujitsu.com>
To: subrata@linux.vnet.ibm.com
Cc: ltp-list <ltp-list@lists.sourceforge.net>,
	Dhaval Giani <dhaval@linux.vnet.ibm.com>,
	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 07:41:29 +0800	[thread overview]
Message-ID: <4AAD8329.7080402@cn.fujitsu.com> (raw)
In-Reply-To: <1252847816.5357.38.camel@subratamodak.linux.ibm.com>

Subrata Modak wrote:
> Hi Shi,
> 
> On Wed, 2009-09-09 at 13:28 +0530, Subrata Modak wrote: 
>> Hi Shi,
>>
>> Thanks once again for contributing the Memcgroup functional and Stress
>> tests. Please find some of my comments below:
> 
> Would you like to resubmit the patch once again addressing the comments
> below ?

Yes. I am busy for other works, but will send you a new patch based on your 
comments in this week, maybe today or tomorrow.


--
Regards
Shi Weihua

> 
> Regards--
> Subrata
> 
>> On Wed, 2009-09-09 at 12:27 +0800, Shi Weihua wrote:
>>> My workmate Li Zefan (lizf@cn.fujitsu.com) has created some testcases for 
>>> cgroup's subsystem "memory" in the last year. And, He catched some kernel bugs 
>>> through these testcases. So we think you glad to push them into LTP.
>>>
>>> There are total 40 testcases that have been added. These testcases contain 
>>> the basis operation test, part functionality test and stress test of memcgroup.
>>>
>>> How to run this test:
>>> 	# runltp -f controllers
>>>
>>> Result:
>>> memcgroup_function_test    1  TPASS  :  rss=4096/4096, cache=0/0
>>> memcgroup_function_test    2  TPASS  :  rss=0/0, cache=4096/4096
>>> memcgroup_function_test    3  TPASS  :  rss=0/0, cache=4096/4096
>>> memcgroup_function_test    4  TPASS  :  rss=4096/4096, cache=8192/8192
>>> memcgroup_function_test    5  TPASS  :  rss=4096/4096, cache=0/0
>>> memcgroup_function_test    6  TPASS  :  rss=4096/4096, cache=0/0
>>> memcgroup_function_test    6  TPASS  :  rss=0/0, cache=0/0
>>> memcgroup_function_test    7  TPASS  :  rss=0/0, cache=4096/4096
>>> memcgroup_function_test    7  TPASS  :  rss=0/0, cache=0/0
>>> memcgroup_function_test    8  TPASS  :  rss=0/0, cache=4096/4096
>>> memcgroup_function_test    8  TPASS  :  rss=0/0, cache=0/0
>>> memcgroup_function_test    9  TPASS  :  rss=4096/4096, cache=8192/8192
>>> memcgroup_function_test    9  TPASS  :  rss=0/0, cache=0/0
>>> memcgroup_function_test   10  TPASS  :  rss=4096/4096, cache=0/0
>>> memcgroup_function_test   10  TPASS  :  rss=0/0, cache=0/0
>>> memcgroup_function_test   11  TPASS  :  failcnt=6
>>> memcgroup_function_test   12  TPASS  :  failcnt=6
>>> memcgroup_function_test   13  TPASS  :  failcnt=6
>>> memcgroup_function_test   14  TPASS  :  process 5793 is killed
>>> memcgroup_function_test   15  TPASS  :  process 5803 is killed
>>> memcgroup_function_test   16  TPASS  :  process 5813 is killed
>>> memcgroup_function_test   17  TPASS  :  process 5824 is killed
>>> memcgroup_function_test   18  TPASS  :  process 5835 is killed
>>> memcgroup_function_test   19  TPASS  :  process 5845 is killed
>>> memcgroup_function_test   20  TPASS  :  process 5854 is killed
>>> memcgroup_function_test   21  TPASS  :  process 5863 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  TPASS  :  return value is 0
>>> 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
>>> memcgroup_stress_test      1  TPASS  :  stress test 1 passed
>>> memcgroup_stress_test      2  TPASS  :  stress test 2 passed
>>> INFO: ltp-pan reported all tests PASS
>>>
>>> Signed-off-by: Shi Weihua <shiwh@cn.fujitsu.com>
>>> ---
>>> diff -urpN ltp-full-20090831.orig/runtest/controllers ltp-full-20090831.memcgroup/runtest/controllers
>>> --- ltp-full-20090831.orig/runtest/controllers	2009-08-31 01:15:37.000000000 -0400
>>> +++ ltp-full-20090831.memcgroup/runtest/controllers	2009-09-07 17:51:12.000000000 -0400
>>> @@ -2,4 +2,6 @@
>>>  cgroup		cgroup_regression_test.sh
>>>  memcg		memcg_regression_test.sh
>>>  cgroup_fj	run_cgroup_test_fj.sh
>>> +memcgroup_function	memcgroup_function_test.sh
>>> +memcgroup_stress	memcgroup_stress_test.sh
>>>  controllers	test_controllers.sh
>>> 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,
>>
>> There is one major anomaly. The tests seems to create something like:
>>
>> # ls /memcg/
>> 0    105  112  12   127  134  141  149  21  29  36  43  50  58  65  72
>> 8   87  94                  memory.limit_in_bytes
>> memory.usage_in_bytes
>> 1    106  113  120  128  135  142  15   22  3   37  44  51  59  66  73
>> 80  88  95                  memory.max_usage_in_bytes
>> memory.use_hierarchy
>> 10   107  114  121  129  136  143  16   23  30  38  45  52  6   67  74
>> 81  89  96                  memory.memsw.failcnt
>> notify_on_release
>> 100  108  115  122  13   137  144  17   24  31  39  46  53  60  68  75
>> 82  9   97                  memory.memsw.limit_in_bytes
>> release_agent
>> 101  109  116  123  130  138  145  18   25  32  4   47  54  61  69  76
>> 83  90  98                  memory.memsw.max_usage_in_bytes  tasks
>> 102  11   117  124  131  139  146  19   26  33  40  48  55  62  7   77
>> 84  91  99                  memory.memsw.usage_in_bytes
>> 103  110  118  125  132  14   147  2    27  34  41  49  56  63  70  78
>> 85  92  memory.failcnt      memory.stat
>> 104  111  119  126  133  140  148  20   28  35  42  5   57  64  71  79
>> 86  93  memory.force_empty  memory.swappiness
>>
>> 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,
>>
>> 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:
>> ==================================================================================================
>> <<<test_start>>>
>> tag=memcgroup_function stime=1252484293
>> cmdline="    memcgroup_function_test.sh"
>> contacts=""
>> analysis=exit
>> <<<test_output>>>
>> memcgroup_function_test    1  TPASS  :  rss=4096/4096, cache=0/0
>> memcgroup_function_test    2  TPASS  :  rss=0/0, cache=4096/4096
>> memcgroup_function_test    3  TPASS  :  rss=0/0, cache=4096/4096
>> memcgroup_function_test    4  TPASS  :  rss=4096/4096, cache=8192/8192
>> memcgroup_function_test    5  TPASS  :  rss=4096/4096, cache=0/0
>> memcgroup_function_test    6  TPASS  :  rss=4096/4096, cache=0/0
>> memcgroup_function_test    6  TPASS  :  rss=0/0, cache=0/0
>> memcgroup_function_test    7  TPASS  :  rss=0/0, cache=4096/4096
>> memcgroup_function_test    7  TPASS  :  rss=0/0, cache=0/0
>> memcgroup_function_test    8  TPASS  :  rss=0/0, cache=4096/4096
>> memcgroup_function_test    8  TPASS  :  rss=0/0, cache=0/0
>> memcgroup_function_test    9  TPASS  :  rss=4096/4096, cache=8192/8192
>> memcgroup_function_test    9  TPASS  :  rss=0/0, cache=0/0
>> memcgroup_function_test   10  TPASS  :  rss=4096/4096, cache=0/0
>> memcgroup_function_test   10  TPASS  :  rss=0/0, cache=0/0
>> /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 104:  5676 Killed                  $TEST_PATH/memcgroup_process $1 -s $2
>> kill 5676: No such process
>> kill 5676: No such process
>> memcgroup_function_test   11  TPASS  :  failcnt=6
>> /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 104:  5688 Killed                  $TEST_PATH/memcgroup_process $1 -s $2
>> kill 5688: No such process
>> kill 5688: No such process
>> memcgroup_function_test   12  TPASS  :  failcnt=6
>> /root/subrata/ltp/ltp-full-20090831/testcases/bin/memcgroup_function_test.sh: line 104:  5700 Killed                  $TEST_PATH/memcgroup_process $1 -s $2
>> kill 5700: No such process
>> kill 5700: No such process
>> memcgroup_function_test   13  TPASS  :  failcnt=6
>> /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 ??>....
>>
>> 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>....
>>
>> <<<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" ?? >....
>>
>> corefile=no
>> cutime=20 cstime=219
>> <<<test_end>>>
>> ==================================================================================================
>>
>> Regards--
>> Subrata
>>
>>>  SUBDIRS += io-throttle
>>>  SUBDIRS += freezer
>>>  SUBDIRS += cpuset
>>> @@ -46,6 +47,7 @@ $(info "Kernel is not compiled with cpu 
>>>  endif
>>>  ifeq ($(CHECK_MEMCTL),memory)
>>>  SUBDIRS += memctl
>>> +SUBDIRS += memcgroup
>>>  else
>>>  $(info "Kernel is not compiled with memory resource controller support")
>>>  endif
>>> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/Makefile ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/Makefile
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/Makefile	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/Makefile	2009-09-01 09:27:24.000000000 -0400
>>> @@ -0,0 +1,24 @@
>>> +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
>>> +	@./memcgroup_stress_test.sh
>>> +
>>> +clean:
>>> +	rm -f $(TARGETS) $(OBJECTS)
>>> +
>>> +uninstall:
>>> +
>>> +.DEFAULT: ;
>>> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_function_test.sh ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_function_test.sh
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_function_test.sh	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_function_test.sh	2009-09-07 17:47:27.000000000 -0400
>>> @@ -0,0 +1,546 @@
>>> +#! /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="memcgroup_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=`./memcgroup_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/memcgroup_process $1 -s $2 &
>>> +	sleep 1
>>> +	echo $! > tasks
>>> +	/bin/kill -s SIGUSR1 $!
>>> +	sleep 1
>>> +
>>> +	check_mem_stat $3 $4
>>> +
>>> +	/bin/kill -s SIGUSR1 $!
>>> +	sleep 1
>>> +	if [ $5 -eq 1 ]; then
>>> +		check_mem_stat 0 0
>>> +	fi
>>> +	/bin/kill -s SIGINT $!
>>> +}
>>> +
>>> +# 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/memcgroup_process $2 -s $3 &
>>> +	pid=$!
>>> +	sleep 1
>>> +	echo $pid > tasks
>>> +
>>> +	/bin/kill -s SIGUSR1 $pid; 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
>>> +		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/memcgroup_process $2 --hugepage -s $3 > $TMP_FILE 2>&1 &
>>> +	sleep 1
>>> +
>>> +	/bin/kill -s SIGUSR1 $!
>>> +	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 $!
>>> +			/bin/kill -s SIGINT $!
>>> +			result $FAIL "allocate hugepage shoud fail"
>>> +		fi
>>> +	else
>>> +		test ! -s $TMP_FILE
>>> +		if [ $? -eq 0 ]; then
>>> +			/bin/kill -s SIGUSR1 $!
>>> +			/bin/kill -s SIGINT $!
>>> +			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/memcgroup_process --mmap-anon -s $PAGESIZE &
>>> +	sleep 1
>>> +	echo $! > tasks
>>> +	/bin/kill -s SIGUSR1 $!
>>> +	sleep 1
>>> +	check_mem_stat $PAGESIZE 0
>>> +
>>> +	cd subgroup
>>> +	echo $! > tasks
>>> +	check_mem_stat 0 0
>>> +
>>> +	# cleanup
>>> +	cd ..
>>> +	echo $! > tasks
>>> +	/bin/kill -s SIGINT $!
>>> +	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/memcgroup_process --mmap-anon -s $PAGESIZE &
>>> +	pid=$!
>>> +	sleep 1
>>> +	echo $pid > tasks
>>> +	/bin/kill -s SIGUSR1 $pid
>>> +	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
>>> +}
>>> +
>>> +testcase_30()
>>> +{
>>> +	$TEST_PATH/memcgroup_process --mmap-anon -s $PAGESIZE &
>>> +	pid=$!
>>> +	sleep 1
>>> +	echo $pid > tasks
>>> +	/bin/kill -s SIGUSR1 $pid
>>> +	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
>>> +}
>>> +
>>> +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
>>> +
>>> +mkdir /memcg 2> /dev/null
>>> +mount -t cgroup -omemory memcg /memcg
>>> +
>>> +# Run all the test cases
>>> +for ((i = 1; i <= $TST_TOTAL; i++))
>>> +{
>>> +	export TST_COUNT=$(( $TST_COUNT + 1 ))
>>> +	cur_id=$i
>>> +
>>> +	# prepare
>>> +	mkdir /memcg/$i
>>> +	cd /memcg/$i
>>> +
>>> +	# run the case
>>> +	testcase_$i
>>> +
>>> +	# clean up
>>> +	sleep 1
>>> +	cd $TEST_PATH
>>> +	rmdir /memcg/$i
>>> +}
>>> +
>>> +umount /memcg
>>> +rmdir /memcg
>>> +
>>> +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/memcgroup/memcgroup_getpagesize.c ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_getpagesize.c
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_getpagesize.c	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_getpagesize.c	2009-09-01 09:27:25.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/memcgroup/memcgroup_process.c ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_process.c
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_process.c	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_process.c	2009-09-01 09:27:26.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/memcgroup/memcgroup_process_stress.c ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_process_stress.c
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_process_stress.c	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_process_stress.c	2009-09-01 09:27:26.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/memcgroup/memcgroup_stress_test.sh ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_stress_test.sh
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/memcgroup_stress_test.sh	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/memcgroup_stress_test.sh	2009-09-07 17:28:39.000000000 -0400
>>> @@ -0,0 +1,109 @@
>>> +#! /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="memcgroup_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 ))
>>> +
>>> +# 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()
>>> +{
>>> +	mkdir /memcg
>>> +	mount -t cgroup -omemory xxx /memcg
>>> +
>>> +	for ((i = 0; i < $1; i++))
>>> +	{
>>> +		mkdir /memcg/$i
>>> +		./memcgroup_process_stress $2 $3 &
>>> +		pid[$i]=$!
>>> +
>>> +		echo ${pid[$i]} > /memcg/$i/tasks
>>> +	}
>>> +
>>> +	for ((i = 0; i < $1; i++))
>>> +	{
>>> +		/bin/kill -s SIGUSR1 ${pid[$i]}
>>> +	}
>>> +
>>> +	sleep $4
>>> +
>>> +	for ((i = 0; i < $1; i++))
>>> +	{
>>> +		/bin/kill -s SIGINT ${pid[$i]}
>>> +		wait ${pid[$i]}
>>> +
>>> +		rmdir /memcg/$i
>>> +	}
>>> +
>>> +	umount /memcg
>>> +	rmdir /memcg
>>> +}
>>> +
>>> +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
>>> diff -urpN ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/README ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/README
>>> --- ltp-full-20090831.orig/testcases/kernel/controllers/memcgroup/README	1969-12-31 19:00:00.000000000 -0500
>>> +++ ltp-full-20090831.memcgroup/testcases/kernel/controllers/memcgroup/README	2009-09-01 09:27:27.000000000 -0400
>>> @@ -0,0 +1,44 @@
>>> +
>>> +TEST SUITE:
>>> +
>>> +The directory memcgroup contains the tests related to the memory controller.
>>> +
>>> +There are total 40 testcases that have been added. These testcases 
>>> +contain the 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 test the functionality of memctl..
>>> +
>>> +FILES DESCRIPTION:
>>> +
>>> +memcgroup_function_test.sh
>>> +--------------------
>>> +This script runs all the 38 testcases of basis operation.
>>> +
>>> +memcgroup_tress_test.sh
>>> +--------------------
>>> +This script runs all the 2 testcases of stress test.
>>> +
>>> +memcgroup_getpagesize.c
>>> +--------------------
>>> +The program gets page size through getpagesize().
>>> +
>>> +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.
>>> +
>>> +memcgroup_process_stress.c
>>> +--------------------
>>> +The program allocates some memory in a specified time period when received SIGUSR. 
>>> +
>>> +Makefile
>>> +--------------------
>>> +The usual makefile for this directory
>>> +
>>> +README
>>> +------
>>> +The one you have gone through.
>>>
>>>
>>
>> ------------------------------------------------------------------------------
>> 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
> 
> 
> 

------------------------------------------------------------------------------
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-13 23:42 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 [this message]
2009-09-14  4:59   ` Shi Weihua
2009-09-14  7:22     ` Subrata Modak

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=4AAD8329.7080402@cn.fujitsu.com \
    --to=shiwh@cn.fujitsu.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=subrata@linux.vnet.ibm.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