From: Mohamed N. <nau...@gm...> - 2010-02-27 13:11:38
|
On 27 February 2010 01:43, Garrett Cooper <yan...@gm...> wrote: [...] Thank you for your comments. Here is the updated patch. <patch> diff -Naru ltpv/runtest/controllers ltpd/runtest/controllers --- ltpv/runtest/controllers 2010-02-20 15:42:13.000000000 +0530 +++ ltpd/runtest/controllers 2010-02-27 17:51:10.358553399 +0530 @@ -3,5 +3,6 @@ memcg_regression memcg_regression_test.sh memcg_function memcg_function_test.sh memcg_stress memcg_stress_test.sh +memcg_control PAGESIZE=$(mem_process -p);memcg_control_test.sh $PAGESIZE $PAGESIZE $((PAGESIZE * 2)) cgroup_fj run_cgroup_test_fj.sh controllers test_controllers.sh diff -Naru ltpv/testcases/kernel/controllers/memcg/control/Makefile ltpd/testcases/kernel/controllers/memcg/control/Makefile --- ltpv/testcases/kernel/controllers/memcg/control/Makefile 1970-01-01 05:30:00.000000000 +0530 +++ ltpd/testcases/kernel/controllers/memcg/control/Makefile 2010-02-27 17:51:10.359555806 +0530 @@ -0,0 +1,33 @@ +# +# kernel/controllers/memcg/stress testcase suite Makefile. +# +# Copyright (C) 2009, Cisco Systems Inc. +# +# 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Garrett Cooper, September 2009 +# + +top_srcdir ?= ../../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +CPPFLAGS += -I$(abs_srcdir)/../../libcontrollers + +INSTALL_TARGETS := *.sh + +LDLIBS += -lm + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff -Naru ltpv/testcases/kernel/controllers/memcg/control/memcg_control_test.sh ltpd/testcases/kernel/controllers/memcg/control/memcg_control_test.sh --- ltpv/testcases/kernel/controllers/memcg/control/memcg_control_test.sh 1970-01-01 05:30:00.000000000 +0530 +++ ltpd/testcases/kernel/controllers/memcg/control/memcg_control_test.sh 2010-02-27 18:17:08.668300711 +0530 @@ -0,0 +1,166 @@ +#!/bin/sh + +################################################################################ +## ## +## Copyright (c) 2010 Mohamed Naufal Basheer ## +## ## +## 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 ## +## ## +## ## +## File: memcg_control_test.sh ## +## ## +## Purpose: Implement various memory controller tests ## +## ## +## Author: Mohamed Naufal Basheer <nau...@gm...> ## +## ## +################################################################################ + +if [ "$(grep -w memory /proc/cgroups | cut -f4)" -ne "1" ]; then + echo "WARNING:" + echo "Either kernel does not support memory resource controller or feature not enabled" + echo "Skipping all memcg_control testcases...." + exit 0 +fi + +export TCID="memcg_control" +export TST_TOTAL=1 +export TST_COUNT=0 + +export TMP=${TMP:-/tmp} +cd $TMP + +TOT_MEM_LIMIT=$1 +ACTIVE_MEM_LIMIT=$2 +PROC_MEM=$3 + +TST_PATH=$PWD +STATUS_PIPE="$TMP/status_pipe" + +PASS=0 +FAIL=1 + +# Check if the test process is killed on crossing boundary +test_proc_kill() +{ + pushd $TMP > /dev/null + mem_process -m $PROC_MEM & + popd > /dev/null + sleep 1 + echo $! > tasks + + #Instruct the test process to start acquiring memory + echo m > $STATUS_PIPE + sleep 5 + + #Check if killed + ps -p $! > /dev/null 2> /dev/null + if [ $? -eq 0 ]; then + echo m > $STATUS_PIPE + echo x > $STATUS_PIPE + else + : $((KILLED_CNT += 1)) + fi +} + +# Validate the memory usage limit imposed by the hierarchically topmost group +testcase_1() +{ + TST_COUNT=1 + tst_resm TINFO "Test #1: Checking if the memory usage limit imposed by the topmost group is enforced" + + echo "$ACTIVE_MEM_LIMIT" > $TST_PATH/mnt/$TST_NUM/memory.limit_in_bytes + echo "$TOT_MEM_LIMIT" > $TST_PATH/mnt/$TST_NUM/memory.memsw.limit_in_bytes + + mkdir sub + pushd sub > /dev/null + + KILLED_CNT=0 + test_proc_kill + + if [ $PROC_MEM -gt $TOT_MEM_LIMIT ] && [ $KILLED_CNT -eq 0 ]; then + result $FAIL "Test #1: failed" + else + result $PASS "Test #1: passed" + fi + + popd > /dev/null + rmdir sub +} + +# Record the test results +# +# $1: Result of the test case, $PASS or $FAIL +# $2: Output information +result() +{ + RES=$1 + INFO=$2 + + if [ $RES -eq $PASS ]; then + tst_resm TPASS "$INFO" + else + : $((FAILED_CNT += 1)) + tst_resm TFAIL "$INFO" + fi +} + +cleanup() +{ + if [ -e $TST_PATH/mnt ]; then + umount $TST_PATH/mnt 2> /dev/null + rm -rf $TST_PATH/mnt + fi +} + +do_mount() +{ + cleanup + + mkdir $TST_PATH/mnt + mount -t cgroup -o memory cgroup $TST_PATH/mnt 2> /dev/null + if [ $? -ne 0 ]; then + tst_brkm TBROK NULL "Mounting cgroup to temp dir failed" + rmdir $TST_PATH/mnt + exit 1 + fi +} + +do_mount + +echo 1 > mnt/memory.use_hierarchy 2> /dev/null + +FAILED_CNT=0 + +TST_NUM=1 +while [ $TST_NUM -le $TST_TOTAL ]; do + mkdir $TST_PATH/mnt/$TST_NUM + pushd $TST_PATH/mnt/$TST_NUM > /dev/null + + testcase_$TST_NUM; + + popd > /dev/null + rmdir $TST_PATH/mnt/$TST_NUM + : $((TST_NUM += 1)) +done + +cleanup + +if [ "$FAILED_CNT" -ne 0 ]; then + tst_resm TFAIL "memcg_control: failed" + exit 1 +else + tst_resm TPASS "memcg_control: passed" + exit 0 +fi diff -Naru ltpv/testcases/kernel/controllers/memcg/control/mem_process.c ltpd/testcases/kernel/controllers/memcg/control/mem_process.c --- ltpv/testcases/kernel/controllers/memcg/control/mem_process.c 1970-01-01 05:30:00.000000000 +0530 +++ ltpd/testcases/kernel/controllers/memcg/control/mem_process.c 2010-02-27 18:22:43.246178794 +0530 @@ -0,0 +1,141 @@ +/*******************************************************************************/ +/* */ +/* Copyright (c) 2010 Mohamed Naufal Basheer */ +/* */ +/* 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 */ +/* */ +/* File: mem_process.c */ +/* */ +/* Purpose: act as a memory hog for the memcg_control tests */ +/* */ +/* Author: Mohamed Naufal Basheer <nau...@gm... > */ +/* */ +/*******************************************************************************/ +#include <stdio.h> +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/mman.h> + +/* + * Named pipe to act as a communication channel between + * shell script & this process + */ +#define STATUS_PIPE "status_pipe" + +int flag_exit; +int flag_allocated; +unsigned long memsize; + +/* + * process_options: process user specified options + */ +void process_options(int argc, char **argv) +{ + int c; + char *end; + + opterr = 0; + while ((c = getopt(argc, argv, "pm:")) != -1) { + switch(c) { + case 'p': + printf("%d\n",getpagesize()); + exit(0); + case 'm': + memsize = strtoul(optarg, &end, 10); + if (*end) + errx(2, "Invalid -m usage"); + break; + default: + errx(2, "Invalid option specifed"); + } + } + + if(memsize <= 0) + errx(3, "Invalid usage"); +} + +/* + * touch_memory: force physical memory allocation + */ +void touch_memory(char *p) +{ + int i; + int pagesize = getpagesize(); + + for (i = 0; i < memsize; i += pagesize) + p[i] = 0xef; +} + +void mem_map() +{ + static char *p; + + if (!flag_allocated) { + p = mmap(NULL, memsize, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0); + if(p == MAP_FAILED) + errx(4, "mmap failed"); + touch_memory(p); + }else { + if (munmap(p, memsize) == -1) + errx(5, "munmap failed"); + } + flag_allocated ^= 1; +} + +/* + * done: retrieve instructions from the named pipe + */ +char action() +{ + char ch; + int fd; + + fd = open(STATUS_PIPE, O_RDONLY); + if (fd < 0) + errx(6, "Error opening named pipe"); + + if (read(fd, &ch, 1) < 0) + errx(7, "Error reading named pipe"); + + close(fd); + + return ch; +} + +int main(int argc, char **argv) +{ + int ret; + char ch; + + process_options(argc, argv); + + ret = mkfifo(STATUS_PIPE, 0666); + + if (ret == -1 && errno != EEXIST) + errx(1, "Error creating named pipe"); + + do { + ch = action(); + + if (ch == 'm') + mem_map(); + }while(ch != 'x'); + + remove(STATUS_PIPE); + + return 0; +} diff -Naru ltpv/testcases/kernel/controllers/memcg/README ltpd/testcases/kernel/controllers/memcg/README --- ltpv/testcases/kernel/controllers/memcg/README 2010-02-20 15:42:13.000000000 +0530 +++ ltpd/testcases/kernel/controllers/memcg/README 2010-02-27 17:51:10.361554968 +0530 @@ -15,6 +15,16 @@ FILES DESCRIPTION: +control/memcg_control_test.sh +-------------------- +This script runs the testcases of control test. + +control/mem_process.c +-------------------- +The program allocates memory specified using the '-m' option when 'm' is received +through the named pipe "status_pipe" and frees it on receiving 'm' again. +It exits on receiving 'x'. It gets the page size on specifying the '-p' option. + functional/memcgroup_function_test.sh -------------------- This script runs all the 38 testcases of basis operation. </patch> Naufal |