add memcgroup regression tests to LTP
PATCH 1/1 add memcgroup regression tests to LTP
Those testcases can reproduce bugs we found in memcg, and is useful to track future regressions.
Note: this test may crash the system with older kernels, so it is disabled for kernels older than 2.6.30
How to run this test:
# runltp -f controllers
Result:
memcg_regression_test 1 PASS : no kernel bug was found memcg_regression_test 2 PASS : EBUSY was returned as expected memcg_regression_test 3 PASS : no kernel bug was found
./memcg_test_4.sh: line 41: 28374 was killed swapoff -amemcg_regression_test 4 PASS : no kernel bug was found
--- runtest/controllers | 1 testcases/kernel/controllers/Makefile | 6 testcases/kernel/controllers/memcg/Makefile | 16 testcases/kernel/controllers/memcg/README | 9 testcases/kernel/controllers/memcg/memcg_regression_test.sh | 227 ++++++++++++ testcases/kernel/controllers/memcg/memcg_test_1.c | 71 +++ testcases/kernel/controllers/memcg/memcg_test_2.c | 53 ++ testcases/kernel/controllers/memcg/memcg_test_4.c | 62 +++ testcases/kernel/controllers/memcg/memcg_test_4.sh | 48 ++ 9 files changed, 493 insertions(+)
runtest/controllers +1 -0
@@ -1,3 +1,4 @@ #DESCRIPTION:Resource Management testing cgroup cgroup_regression_test.sh +memcg memcg_regression_test.sh controllers test_controllers.sh
testcases/kernel/controllers/Makefile +6 -0
@@ -10,6 +10,12 @@ else $(info "Kernel is not compiled with control cgroup support") endif +ifeq ($(CHECK_MEMCTL),memory) +SUBDIRS += memcg +else +$(info "Kernel is not compiled with memory resource controller support") +endif + ifeq ($(CHECK_CPUCTL),cpu) SUBDIRS += cpuctl else
testcases/kernel/controllers/memcg/Makefile +16 -0
@@ -0,0 +1,16 @@ +CFLAGS += -Wall +CPPFLAGS += -I../../../../include -I../libcontrollers +LDLIBS += -L../../../../lib/ -lltp + +SRCS = $(wildcard *.c) + +TARGETS = $(patsubst %.c,%,$(SRCS)) + +all: $(TARGETS) + +clean: + rm -f $(TARGETS) *.o + +install: + @set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../bin/$$i ; chmod +x $$i ; done +
testcases/kernel/controllers/memcg/memcg_regression_test.sh +227 -0
227 lines not on this page · raw message
testcases/kernel/controllers/memcg/memcg_test_1.c +71 -0
71 lines not on this page · raw message
testcases/kernel/controllers/memcg/memcg_test_2.c +53 -0
53 lines not on this page · raw message
testcases/kernel/controllers/memcg/memcg_test_4.c +62 -0
62 lines not on this page · raw message
testcases/kernel/controllers/memcg/memcg_test_4.sh +48 -0
48 lines not on this page · raw message
testcases/kernel/controllers/memcg/README +9 -0
@@ -0,0 +1,9 @@ +TEST SUITE: + +The directory memcg contains the tests related to memory resource controller. +Those testcases can reproduce bugs we found. + +TESTS AIM: + +The aim of the tests is to track any future regressions. +
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensing option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Ltp-list mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
Quoted 11 lines · Li Zefan
Those testcases can reproduce bugs we found in memcg, and is useful to track future regressions.
Note: this test may crash the system with older kernels, so it is disabled for kernels older than 2.6.30
How to run this test:
# runltp -f controllersResult:
Quoted 7 lines
memcg_regression_test 1 PASS : no kernel bug was found memcg_regression_test 2 PASS : EBUSY was returned as expected memcg_regression_test 3 PASS : no kernel bug was found./memcg_test_4.sh: line 41: 28374 was killed swapoff -a
memcg_regression_test4 PASS : no kernel bug was foundSigned-off-by Li Zefan <[email protected]>
Thanks Li for these tests. Added.
Regards--
Subrata
Quoted 541 lines
--- runtest/controllers | 1 testcases/kernel/controllers/Makefile | 6 testcases/kernel/controllers/memcg/Makefile | 16 testcases/kernel/controllers/memcg/README | 9 testcases/kernel/controllers/memcg/memcg_regression_test.sh | 227 ++++++++++++ testcases/kernel/controllers/memcg/memcg_test_1.c | 71 +++ testcases/kernel/controllers/memcg/memcg_test_2.c | 53 ++ testcases/kernel/controllers/memcg/memcg_test_4.c | 62 +++ testcases/kernel/controllers/memcg/memcg_test_4.sh | 48 ++ 9 files changed, 493 insertions(+)diff -Nurp ltp-intermediate-20090420.orig/runtest/controllers ltp-intermediate-20090420/runtest/controllers
runtest/controllers +1
-0@@ -1,3 +1,4 @@ #DESCRIPTION:Resource Management testing cgroup cgroup_regression_test.sh +memcg memcg_regression_test.sh controllers test_controllers.shdiff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/Makefile
testcases/kernel/controllers/Makefile +6
-0@@ -10,6 +10,12 @@ else $(info "Kernel is not compiled with control cgroup support") endif +ifeq ($(CHECK_MEMCTL),memory) +SUBDIRS += memcg +else +$(info "Kernel is not compiled with memory resource controller support") +endif + ifeq ($(CHECK_CPUCTL),cpu) SUBDIRS += cpuctl elsediff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/memcg/Makefile
testcases/kernel/controllers/memcg/Makefile +16
-0@@ -0,0 +1,16 @@ +CFLAGS += -Wall +CPPFLAGS += -I../../../../include -I../libcontrollers +LDLIBS += -L../../../../lib/ -lltp + +SRCS = $(wildcard *.c) + +TARGETS = $(patsubst %.c,%,$(SRCS)) + +all: $(TARGETS) + +clean: + rm -f $(TARGETS) *.o + +install: + @set -e; for i in $(TARGETS) *.sh; do ln -f $$i ../../../bin/$$i ; chmod +x $$i ; done +diff -Nurp
ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_regression_test.shltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_regression_test.shtestcases/kernel/controllers/memcg/memcg_regression_test.sh +227
-0@@ -0,0 +1,227 @@ +#! /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]> ## +## ## +################################################################################ + +cd $LTPROOT/testcases/bin + +export TCID="memcg_regression_test" +export TST_TOTAL=4 +export TST_COUNT=1 + +if [ "$USER" != root ]; then + tst_brkm TBROK ignored "Test must be run as root" + exit 0 +fi + +tst_kvercmp 2 6 30 +if [ $? -eq 0 ]; then + tst_brkm TBROK ignored "Test should be run with kernel 2.6.30 or newer" + exit 0 +fi + +nr_bug=`dmesg | grep -c "kernel BUG"` +nr_null=`dmesg | grep -c "kernel NULL pointer dereference"` +nr_warning=`dmesg | grep -c "^WARNING"` +nr_lockdep=`dmesg | grep -c "possible recursive locking detected"` + +# check_kernel_bug - check if some kind of kernel bug happened +check_kernel_bug() +{ + new_bug=`dmesg | grep -c "kernel BUG"` + new_null=`dmesg | grep -c "kernel NULL pointer dereference"` + new_warning=`dmesg | grep -c "^WARNING"` + new_lockdep=`dmesg | grep -c "possible recursive locking detected"` + + # no kernel bug is detected + if [ $new_bug -eq $nr_bug -a $new_warning -eq $nr_warning -a \ + $new_null -eq $nr_null -a $new_lockdep -eq $nr_lockdep ]; then + return 1 + fi + + # some kernel bug is detected + if [ $new_bug -gt $nr_bug ]; then + tst_resm TFAIL "kernel BUG was detected!" + fi + if [ $new_warning -gt $nr_warning ]; then + tst_resm TFAIL "kernel WARNING was detected!" + fi + if [ $new_null -gt $nr_null ]; then + tst_resm "kernel NULL pointer dereference!" + fi + if [ $new_lockdep -gt $nr_lockdep ]; then + tst_resm "kernel lockdep warning was detected!" + fi + + nr_bug=$new_bug + nr_null=$new_null + nr_warning=$new_warning + nr_lockdep=$new_lockdep + + failed=1 + return 0 +} + +#--------------------------------------------------------------------------- +# Bug: The bug was, while forking mass processes, trigger memcgroup OOM, +# then NULL pointer dereference may be hit. +# Kernel: 2.6.25-rcX +# Links: http://lkml.org/lkml/2008/4/14/38 +# Fix: commit e115f2d89253490fb2dbf304b627f8d908df26f1 +#--------------------------------------------------------------------------- +test_1() +{ + mkdir memcg/0/ + echo 0 > memcg/0/memory.limit_in_bytes + + ./memcg_test_1 + + rmdir memcg/0/ + + check_kernel_bug + if [ $? -eq 1 ]; then + tst_resm TPASS "no kernel bug was found" + fi +} + +#--------------------------------------------------------------------------- +# Bug: Shrink memory might never return, unless send signal to stop it. +# Kernel: 2.6.29 +# Links: http://marc.info/?t=123199973900003&r=1&w=2 +# http://lkml.org/lkml/2009/2/3/72 +# Fix: 81d39c20f5ee2437d71709beb82597e2a38efbbc +#--------------------------------------------------------------------------- +test_2() +{ + ./memcg_test_2 & + pid1=$! + sleep 1 + + mkdir memcg/0 + echo $pid1 > memcg/0/tasks + + # let pid1 'test_2' allocate memory + /bin/kill -SIGUSR1 $pid1 + sleep 1 + + # shrink memory + echo 1 > memcg/0/memory.limit_in_bytes 2>&1 & + pid2=$! + + # check if 'echo' will exit and exit with failure + for ((tmp = 0; tmp < 5; tmp++)) + { + sleep 1 + ps -p $! > /dev/null + if [ $? -ne 0 ]; then + wait $pid2 + if [ $? -eq 0 ]; then + tst_resm TFAIL "echo should return failure" + failed=1 + kill -9 $pid1 $pid2 > /dev/null 2>&1 + wait $pid1 $pid2 + rmdir memcg/0 + fi + break + fi + } + + if [ $tmp -eq 5 ]; then + tst_resm TFAIL "'echo' doesn't exit!" + failed=1 + else + tst_resm TPASS "EBUSY was returned as expected" + fi + + kill -9 $pid1 $pid2 > /dev/null 2>&1 + wait $pid1 $pid2 > /dev/null 2>&1 + rmdir memcg/0 +} + +#--------------------------------------------------------------------------- +# Bug: crash when rmdir a cgroup on IA64 +# Kernel: 2.6.29-rcX +# Links: http://marc.info/?t=123235660300001&r=1&w=2 +# Fix: commit 299b4eaa302138426d5a9ecd954de1f565d76c94 +#--------------------------------------------------------------------------- +test_3() +{ + mkdir memcg/0 + for pid in `cat memcg/tasks`; do + echo $pid > memcg/0/tasks 2> /dev/null + done + + for pid in `cat memcg/0/tasks`; do + echo $pid > memcg/tasks 2> /dev/null + done + rmdir memcg/0 + + check_kernel_bug + if [ $? -eq 1 ]; then + tst_resm TPASS "no kernel bug was found" + fi +} + +#--------------------------------------------------------------------------- +# Bug: the memcg's refcnt handling at swapoff was wrong, causing crash +# Kernel: 2.6.29-rcX +# Links: http://marc.info/?t=123208656300004&r=1&w=2 +# Fix: commit 85d9fc89fb0f0703df6444f260187c088a8d59ff +#--------------------------------------------------------------------------- +test_4() +{ + ./memcg_test_4.sh + + check_kernel_bug + if [ $? -eq 1 ]; then + tst_resm TPASS "no kernel bug was found" + fi + + # test_4.sh might be killed by oom, so do clean up here + killall -9 memcg_test_4 2> /dev/null + killall -9 memcg_test_4.sh 2> /dev/null + swapon -a +} + +# main + +mkdir memcg/ + +for ((cur = 1; cur <= $TST_TOTAL; cur++)) +{ + export TST_COUNT=$cur + + mount -t cgroup -o memory xxx memcg/ + if [ $? -ne 0 ]; then + tst_resm TFAIL "failed to mount memory subsytem" + continue + fi + + test_$cur + + umount memcg/ +} + +rmdir memcg/ + +exit $failed +diff -Nurp
ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_1.cltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_1.ctestcases/kernel/controllers/memcg/memcg_test_1.c +71
-0@@ -0,0 +1,71 @@ +/******************************************************************************/ +/* */ +/* Copyright (c) 2009 FUJITSU LIMITED */ +/* */ +/* This program is free software; you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ +/* the GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Author: Li Zefan <[email protected]> */ +/* */ +/******************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <sys/wait.h> + +#define MAP_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_LOCKED) + +#define LOOP 40 + +int main (void ) +{ +char buf[10 ]; +int i; +int loop; +int pid; +int size =getpagesize (); +int fd =open ("memcg/0/tasks" ,O_WRONLY ); + +if (fd <0 ) +return 1 ; + +for (loop =0 ; loop <LOOP ; loop++) { +for (i =0 ; i <10 ; i++) { + pid =fork (); +if (pid ==0 ) { +char *p; + +sprintf (buf,"%d" ,getpid ()); +write (fd, buf,10 ); +fsync (fd); + + p =mmap (NULL , size,PROT_READ |PROT_WRITE , +MAP_FLAGS ,0 ,0 ); + +return 0 ; + } + } + +for (i =0 ; i <10 ; i++) +wait (NULL ); + } + +close (fd); + +return 0 ; +} +diff -Nurp
ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_2.cltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_2.ctestcases/kernel/controllers/memcg/memcg_test_2.c +53
-0@@ -0,0 +1,53 @@ +/******************************************************************************/ +/* */ +/* Copyright (c) 2009 FUJITSU LIMITED */ +/* */ +/* This program is free software; you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ +/* the GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Author: Li Zefan <[email protected]> */ +/* */ +/******************************************************************************/ + +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <sys/mman.h> +#include <signal.h> + +void sigusr_handler (int __attribute__((unused)) signo) +{ +char *p; +int size =getpagesize () *2 ; + + p =mmap (NULL , size,PROT_READ |PROT_WRITE , +MAP_PRIVATE |MAP_ANONYMOUS |MAP_LOCKED ,0 ,0 ); +if (p ==MAP_FAILED ) +exit (1 ); +} + +int main (void ) +{ +struct sigaction sigusr_action; + +memset (&sigusr_action,0 ,sizeof (sigusr_action)); + sigusr_action.sa_handler = &sigusr_handler; +sigaction (SIGUSR1 , &sigusr_action,NULL ); + +while (1 ) +sleep (1 ); + +return 0 ; +} +diff -Nurp
ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.cltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.ctestcases/kernel/controllers/memcg/memcg_test_4.c +62
-0@@ -0,0 +1,62 @@ +/******************************************************************************/ +/* */ +/* Copyright (c) 2009 FUJITSU LIMITED */ +/* */ +/* This program is free software; you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ +/* the GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* */ +/* Author: Li Zefan <[email protected]> */ +/* */ +/******************************************************************************/ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <signal.h> +#include <sys/mman.h> + +#define MEM_SIZE (1024 * 1024 * 100) + +void sigusr_handler (int __attribute__((unused)) signo) +{ +char *p; +int i; +int pagesize =getpagesize (); + + p =mmap (NULL ,MEM_SIZE ,PROT_READ |PROT_WRITE , +MAP_PRIVATE |MAP_ANONYMOUS ,0 ,0 ); +if (p ==MAP_FAILED ) { +fprintf (stderr,"failed to allocate memory!\n" ); +exit (1 ); + } + +for (i =0 ; i <MEM_SIZE ; i += pagesize) + p[i] ='z' ; +} + +int main (void ) +{ +struct sigaction sigusr_action; + +memset (&sigusr_action,0 ,sizeof (sigusr_action)); + sigusr_action.sa_handler = &sigusr_handler; +sigaction (SIGUSR1 , &sigusr_action,NULL ); + +while (1 ) +sleep (1 ); + +return 0 ; +} +diff -Nurp
ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.shltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.shtestcases/kernel/controllers/memcg/memcg_test_4.sh +48
-0@@ -0,0 +1,48 @@ +#! /bin/sh + +################################################################################ +## ## +## Copyright (c) 2009 FUJITSU LIMITED ## +## ## +## This program is free software; you can redistribute it and#or modify ## +## it under the terms of the GNU General Public License as published by ## +## the Free Software Foundation; either version 2 of the License, or ## +## (at your option) any later version. ## +## ## +## This program is distributed in the hope that it will be useful, but ## +## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ## +## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## +## for more details. ## +## ## +## You should have received a copy of the GNU General Public License ## +## along with this program; if not, write to the Free Software ## +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## +## ## +## Author: Li Zefan <[email protected]> ## +## ## +################################################################################ + +# attach current task to memcg/0/ +mkdir memcg/0 +echo $$ > memcg/0/tasks + +./memcg_test_4 & +pid=$! +sleep 1 + +# let $pid allocate 100M memory +/bin/kill -SIGUSR1 $pid +sleep 1 + +# shrink memory, and then 80M will be swapped +echo 40M > memcg/0/memory.limit_in_bytes + +# turn off swap, and swapoff will be killed +swapoff -a +sleep 1 +echo $pid > memcg/tasks 2> /dev/null +echo $$ > memcg/tasks 2> /dev/null + +# now remove the cgroup +rmdir memcg/0 +diff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/README ltp-intermediate-20090420/testcases/kernel/controllers/memcg/README
testcases/kernel/controllers/memcg/README line 9
Quoted 9 lines
testcases/kernel/controllers/memcg/README +9
-0@@ -0,0 +1,9 @@ +TEST SUITE: + +The directory memcg contains the tests related to memory resource controller. +Those testcases can reproduce bugs we found. + +TESTS AIM: + +The aim of the tests is to track any future regressions. +
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensing option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Ltp-list mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list