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 ([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