* [LTP] [PATCH] add memcgroup regression tests to LTP
@ 2009-05-18 2:15 Li Zefan
2009-05-18 12:01 ` Subrata Modak
0 siblings, 1 reply; 2+ messages in thread
From: Li Zefan @ 2009-05-18 2:15 UTC (permalink / raw)
To: Subrata Modak; +Cc: ltp-list
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 -a
memcg_regression_test 4 PASS : no kernel bug was found
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
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
--- ltp-intermediate-20090420.orig/runtest/controllers 2009-05-18 09:53:42.000000000 +0800
+++ ltp-intermediate-20090420/runtest/controllers 2009-05-18 09:54:02.000000000 +0800
@@ -1,3 +1,4 @@
#DESCRIPTION:Resource Management testing
cgroup cgroup_regression_test.sh
+memcg memcg_regression_test.sh
controllers test_controllers.sh
diff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/Makefile
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/Makefile 2009-05-18 09:53:42.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/Makefile 2009-05-15 14:53:17.000000000 +0800
@@ -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
diff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/memcg/Makefile
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/Makefile 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/Makefile 2009-05-15 14:46:35.000000000 +0800
@@ -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.sh ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_regression_test.sh
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_regression_test.sh 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_regression_test.sh 2009-05-15 15:05:00.000000000 +0800
@@ -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 <lizf@cn.fujitsu.com> ##
+## ##
+################################################################################
+
+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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_1.c
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_1.c 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_1.c 2009-05-15 14:48:05.000000000 +0800
@@ -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 <lizf@cn.fujitsu.com> */
+/* */
+/******************************************************************************/
+
+#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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_2.c
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_2.c 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_2.c 2009-05-15 14:48:18.000000000 +0800
@@ -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 <lizf@cn.fujitsu.com> */
+/* */
+/******************************************************************************/
+
+#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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.c
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.c 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.c 2009-05-15 14:48:28.000000000 +0800
@@ -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 <lizf@cn.fujitsu.com> */
+/* */
+/******************************************************************************/
+
+#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.sh ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.sh
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.sh 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.sh 2009-05-15 14:59:38.000000000 +0800
@@ -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 <lizf@cn.fujitsu.com> ##
+## ##
+################################################################################
+
+# 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
--- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/README 1970-01-01 08:00:00.000000000 +0800
+++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/README 2009-05-15 14:47:26.000000000 +0800
@@ -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
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [LTP] [PATCH] add memcgroup regression tests to LTP
2009-05-18 2:15 [LTP] [PATCH] add memcgroup regression tests to LTP Li Zefan
@ 2009-05-18 12:01 ` Subrata Modak
0 siblings, 0 replies; 2+ messages in thread
From: Subrata Modak @ 2009-05-18 12:01 UTC (permalink / raw)
To: Li Zefan; +Cc: ltp-list
On Mon, 2009-05-18 at 10:15 +0800, Li Zefan wrote:
> 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 -a
> memcg_regression_test 4 PASS : no kernel bug was found
>
> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Thanks Li for these tests. Added.
Regards--
Subrata
> ---
> 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
> --- ltp-intermediate-20090420.orig/runtest/controllers 2009-05-18 09:53:42.000000000 +0800
> +++ ltp-intermediate-20090420/runtest/controllers 2009-05-18 09:54:02.000000000 +0800
> @@ -1,3 +1,4 @@
> #DESCRIPTION:Resource Management testing
> cgroup cgroup_regression_test.sh
> +memcg memcg_regression_test.sh
> controllers test_controllers.sh
> diff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/Makefile
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/Makefile 2009-05-18 09:53:42.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/Makefile 2009-05-15 14:53:17.000000000 +0800
> @@ -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
> diff -Nurp ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/Makefile ltp-intermediate-20090420/testcases/kernel/controllers/memcg/Makefile
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/Makefile 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/Makefile 2009-05-15 14:46:35.000000000 +0800
> @@ -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.sh ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_regression_test.sh
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_regression_test.sh 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_regression_test.sh 2009-05-15 15:05:00.000000000 +0800
> @@ -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 <lizf@cn.fujitsu.com> ##
> +## ##
> +################################################################################
> +
> +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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_1.c
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_1.c 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_1.c 2009-05-15 14:48:05.000000000 +0800
> @@ -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 <lizf@cn.fujitsu.com> */
> +/* */
> +/******************************************************************************/
> +
> +#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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_2.c
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_2.c 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_2.c 2009-05-15 14:48:18.000000000 +0800
> @@ -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 <lizf@cn.fujitsu.com> */
> +/* */
> +/******************************************************************************/
> +
> +#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.c ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.c
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.c 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.c 2009-05-15 14:48:28.000000000 +0800
> @@ -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 <lizf@cn.fujitsu.com> */
> +/* */
> +/******************************************************************************/
> +
> +#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.sh ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.sh
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/memcg_test_4.sh 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/memcg_test_4.sh 2009-05-15 14:59:38.000000000 +0800
> @@ -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 <lizf@cn.fujitsu.com> ##
> +## ##
> +################################################################################
> +
> +# 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
> --- ltp-intermediate-20090420.orig/testcases/kernel/controllers/memcg/README 1970-01-01 08:00:00.000000000 +0800
> +++ ltp-intermediate-20090420/testcases/kernel/controllers/memcg/README 2009-05-15 14:47:26.000000000 +0800
> @@ -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
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-05-18 12:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-18 2:15 [LTP] [PATCH] add memcgroup regression tests to LTP Li Zefan
2009-05-18 12:01 ` Subrata Modak
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.