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
