1#!/bin/sh 2 3################################################################################ 4## ## 5## Copyright (c) 2010 Mohamed Naufal Basheer ## 6## ## 7## This program is free software; you can redistribute it and/or modify ## 8## it under the terms of the GNU General Public License as published by ## 9## the Free Software Foundation; either version 2 of the License, or ## 10## (at your option) any later version. ## 11## ## 12## This program is distributed in the hope that it will be useful, ## 13## but WITHOUT ANY WARRANTY; without even the implied warranty of ## 14## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See ## 15## the GNU General Public License for more details. ## 16## ## 17## You should have received a copy of the GNU General Public License ## 18## along with this program; if not, write to the Free Software ## 19## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ## 20## ## 21## ## 22## File: memcg_control_test.sh ## 23## ## 24## Purpose: Implement various memory controller tests ## 25## ## 26## Author: Mohamed Naufal Basheer <naufal11@gmail.com> ## 27## ## 28################################################################################ 29 30if [ "x$(grep -w memory /proc/cgroups | cut -f4)" != "x1" ]; then 31 echo "WARNING:" 32 echo "Either kernel does not support memory resource controller or feature not enabled" 33 echo "Skipping all memcg_control testcases...." 34 exit 0 35fi 36 37export TCID="memcg_control" 38export TST_TOTAL=1 39export TST_COUNT=0 40 41export TMP=${TMP:-/tmp} 42cd $TMP 43 44PAGE_SIZE=$(tst_getconf PAGESIZE) 45 46TOT_MEM_LIMIT=$PAGE_SIZE 47ACTIVE_MEM_LIMIT=$PAGE_SIZE 48PROC_MEM=$((PAGE_SIZE * 2)) 49 50TST_PATH=$PWD 51STATUS_PIPE="$TMP/status_pipe" 52 53PASS=0 54FAIL=1 55 56# Check if the test process is killed on crossing boundary 57test_proc_kill() 58{ 59 cd $TMP 60 mem_process -m $PROC_MEM & 61 cd $OLDPWD 62 sleep 1 63 echo $! > tasks 64 65 #Instruct the test process to start acquiring memory 66 echo m > $STATUS_PIPE 67 sleep 5 68 69 #Check if killed 70 ps -p $! > /dev/null 2> /dev/null 71 if [ $? -eq 0 ]; then 72 echo m > $STATUS_PIPE 73 echo x > $STATUS_PIPE 74 else 75 : $((KILLED_CNT += 1)) 76 fi 77} 78 79# Validate the memory usage limit imposed by the hierarchically topmost group 80testcase_1() 81{ 82 TST_COUNT=1 83 tst_resm TINFO "Test #1: Checking if the memory usage limit imposed by the topmost group is enforced" 84 85 echo "$ACTIVE_MEM_LIMIT" > $TST_PATH/mnt/$TST_NUM/memory.limit_in_bytes 86 echo "$TOT_MEM_LIMIT" > $TST_PATH/mnt/$TST_NUM/memory.memsw.limit_in_bytes 87 88 mkdir sub 89 (cd sub 90 KILLED_CNT=0 91 test_proc_kill 92 93 if [ $PROC_MEM -gt $TOT_MEM_LIMIT ] && [ $KILLED_CNT -eq 0 ]; then 94 result $FAIL "Test #1: failed" 95 else 96 result $PASS "Test #1: passed" 97 fi) 98 rmdir sub 99} 100 101# Record the test results 102# 103# $1: Result of the test case, $PASS or $FAIL 104# $2: Output information 105result() 106{ 107 RES=$1 108 INFO=$2 109 110 if [ $RES -eq $PASS ]; then 111 tst_resm TPASS "$INFO" 112 else 113 : $((FAILED_CNT += 1)) 114 tst_resm TFAIL "$INFO" 115 fi 116} 117 118cleanup() 119{ 120 if [ -e $TST_PATH/mnt ]; then 121 umount $TST_PATH/mnt 2> /dev/null 122 rm -rf $TST_PATH/mnt 123 fi 124} 125 126do_mount() 127{ 128 cleanup 129 130 mkdir $TST_PATH/mnt 131 mount -t cgroup -o memory cgroup $TST_PATH/mnt 2> /dev/null 132 if [ $? -ne 0 ]; then 133 tst_brkm TBROK NULL "Mounting cgroup to temp dir failed" 134 rmdir $TST_PATH/mnt 135 exit 1 136 fi 137} 138 139do_mount 140 141echo 1 > mnt/memory.use_hierarchy 2> /dev/null 142 143FAILED_CNT=0 144 145TST_NUM=1 146while [ $TST_NUM -le $TST_TOTAL ]; do 147 mkdir $TST_PATH/mnt/$TST_NUM 148 (cd $TST_PATH/mnt/$TST_NUM && testcase_$TST_NUM) 149 rmdir $TST_PATH/mnt/$TST_NUM 150 : $((TST_NUM += 1)) 151done 152 153echo 0 > mnt/memory.use_hierarchy 2> /dev/null 154 155cleanup 156 157if [ "$FAILED_CNT" -ne 0 ]; then 158 tst_resm TFAIL "memcg_control: failed" 159 exit 1 160else 161 tst_resm TPASS "memcg_control: passed" 162 exit 0 163fi 164