blob: 4d9f1bb5d5865535c3bccb33714b5e7164f83606 [file] [log] [blame]
#!/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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ##
## ##
## ##
## File: memcg_control_test.sh ##
## ##
## Purpose: Implement various memory controller tests ##
## ##
## Author: Mohamed Naufal Basheer <naufal11@gmail.com> ##
## ##
################################################################################
if [ "x$(grep -w memory /proc/cgroups | cut -f4)" != "x1" ]; 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
PAGE_SIZE=$(tst_getconf PAGESIZE)
TOT_MEM_LIMIT=$PAGE_SIZE
ACTIVE_MEM_LIMIT=$PAGE_SIZE
PROC_MEM=$((PAGE_SIZE * 2))
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()
{
cd $TMP
mem_process -m $PROC_MEM &
cd $OLDPWD
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
(cd sub
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)
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
(cd $TST_PATH/mnt/$TST_NUM && testcase_$TST_NUM)
rmdir $TST_PATH/mnt/$TST_NUM
: $((TST_NUM += 1))
done
echo 0 > mnt/memory.use_hierarchy 2> /dev/null
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