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 ?

Regards--
Subrata

> 
> On Wed, 2009-09-09 at 12:27 +0800, Shi Weihua wrote:
> > My workmate Li Zefan ([email protected]) 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 <[email protected]>
> > ---
> > 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 <[email protected]>                                  
> >    ##
> > +## Restructure for LTP: Shi Weihua <[email protected]>                  
> >    ##
> > +##                                                                         
> >    ##
> > +################################################################################
> > +
> > +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 <[email protected]>                                  
> >    */
> > +/*                                                                         
> >    */
> > +/******************************************************************************/
> > +
> > +#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 <[email protected]>                                  
> >    */
> > +/*                                                                         
> >    */
> > +/******************************************************************************/
> > +
> > +#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 <[email protected]>                                  
> >    */
> > +/*                                                                         
> >    */
> > +/******************************************************************************/
> > +
> > +#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 <[email protected]>                                  
> >    ##
> > +## Restructure for LTP: Shi Weihua <[email protected]>                  
> >    ##
> > +##                                                                         
> >    ##
> > +################################################################################
> > +
> > +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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to