1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyunset -e 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunif [[ $(id -u) -ne 0 ]]; then 7*4882a593Smuzhiyun echo "This test must be run as root. Skipping..." 8*4882a593Smuzhiyun exit 0 9*4882a593Smuzhiyunfi 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunfault_limit_file=limit_in_bytes 12*4882a593Smuzhiyunreservation_limit_file=rsvd.limit_in_bytes 13*4882a593Smuzhiyunfault_usage_file=usage_in_bytes 14*4882a593Smuzhiyunreservation_usage_file=rsvd.usage_in_bytes 15*4882a593Smuzhiyun 16*4882a593Smuzhiyunif [[ "$1" == "-cgroup-v2" ]]; then 17*4882a593Smuzhiyun cgroup2=1 18*4882a593Smuzhiyun fault_limit_file=max 19*4882a593Smuzhiyun reservation_limit_file=rsvd.max 20*4882a593Smuzhiyun fault_usage_file=current 21*4882a593Smuzhiyun reservation_usage_file=rsvd.current 22*4882a593Smuzhiyunfi 23*4882a593Smuzhiyun 24*4882a593Smuzhiyuncgroup_path=/dev/cgroup/memory 25*4882a593Smuzhiyunif [[ ! -e $cgroup_path ]]; then 26*4882a593Smuzhiyun mkdir -p $cgroup_path 27*4882a593Smuzhiyun if [[ $cgroup2 ]]; then 28*4882a593Smuzhiyun mount -t cgroup2 none $cgroup_path 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun mount -t cgroup memory,hugetlb $cgroup_path 31*4882a593Smuzhiyun fi 32*4882a593Smuzhiyunfi 33*4882a593Smuzhiyun 34*4882a593Smuzhiyunif [[ $cgroup2 ]]; then 35*4882a593Smuzhiyun echo "+hugetlb" >/dev/cgroup/memory/cgroup.subtree_control 36*4882a593Smuzhiyunfi 37*4882a593Smuzhiyun 38*4882a593Smuzhiyunfunction cleanup() { 39*4882a593Smuzhiyun if [[ $cgroup2 ]]; then 40*4882a593Smuzhiyun echo $$ >$cgroup_path/cgroup.procs 41*4882a593Smuzhiyun else 42*4882a593Smuzhiyun echo $$ >$cgroup_path/tasks 43*4882a593Smuzhiyun fi 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun if [[ -e /mnt/huge ]]; then 46*4882a593Smuzhiyun rm -rf /mnt/huge/* 47*4882a593Smuzhiyun umount /mnt/huge || echo error 48*4882a593Smuzhiyun rmdir /mnt/huge 49*4882a593Smuzhiyun fi 50*4882a593Smuzhiyun if [[ -e $cgroup_path/hugetlb_cgroup_test ]]; then 51*4882a593Smuzhiyun rmdir $cgroup_path/hugetlb_cgroup_test 52*4882a593Smuzhiyun fi 53*4882a593Smuzhiyun if [[ -e $cgroup_path/hugetlb_cgroup_test1 ]]; then 54*4882a593Smuzhiyun rmdir $cgroup_path/hugetlb_cgroup_test1 55*4882a593Smuzhiyun fi 56*4882a593Smuzhiyun if [[ -e $cgroup_path/hugetlb_cgroup_test2 ]]; then 57*4882a593Smuzhiyun rmdir $cgroup_path/hugetlb_cgroup_test2 58*4882a593Smuzhiyun fi 59*4882a593Smuzhiyun echo 0 >/proc/sys/vm/nr_hugepages 60*4882a593Smuzhiyun echo CLEANUP DONE 61*4882a593Smuzhiyun} 62*4882a593Smuzhiyun 63*4882a593Smuzhiyunfunction expect_equal() { 64*4882a593Smuzhiyun local expected="$1" 65*4882a593Smuzhiyun local actual="$2" 66*4882a593Smuzhiyun local error="$3" 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun if [[ "$expected" != "$actual" ]]; then 69*4882a593Smuzhiyun echo "expected ($expected) != actual ($actual): $3" 70*4882a593Smuzhiyun cleanup 71*4882a593Smuzhiyun exit 1 72*4882a593Smuzhiyun fi 73*4882a593Smuzhiyun} 74*4882a593Smuzhiyun 75*4882a593Smuzhiyunfunction get_machine_hugepage_size() { 76*4882a593Smuzhiyun hpz=$(grep -i hugepagesize /proc/meminfo) 77*4882a593Smuzhiyun kb=${hpz:14:-3} 78*4882a593Smuzhiyun mb=$(($kb / 1024)) 79*4882a593Smuzhiyun echo $mb 80*4882a593Smuzhiyun} 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunMB=$(get_machine_hugepage_size) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyunfunction setup_cgroup() { 85*4882a593Smuzhiyun local name="$1" 86*4882a593Smuzhiyun local cgroup_limit="$2" 87*4882a593Smuzhiyun local reservation_limit="$3" 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun mkdir $cgroup_path/$name 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun echo writing cgroup limit: "$cgroup_limit" 92*4882a593Smuzhiyun echo "$cgroup_limit" >$cgroup_path/$name/hugetlb.${MB}MB.$fault_limit_file 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun echo writing reseravation limit: "$reservation_limit" 95*4882a593Smuzhiyun echo "$reservation_limit" > \ 96*4882a593Smuzhiyun $cgroup_path/$name/hugetlb.${MB}MB.$reservation_limit_file 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun if [ -e "$cgroup_path/$name/cpuset.cpus" ]; then 99*4882a593Smuzhiyun echo 0 >$cgroup_path/$name/cpuset.cpus 100*4882a593Smuzhiyun fi 101*4882a593Smuzhiyun if [ -e "$cgroup_path/$name/cpuset.mems" ]; then 102*4882a593Smuzhiyun echo 0 >$cgroup_path/$name/cpuset.mems 103*4882a593Smuzhiyun fi 104*4882a593Smuzhiyun} 105*4882a593Smuzhiyun 106*4882a593Smuzhiyunfunction wait_for_hugetlb_memory_to_get_depleted() { 107*4882a593Smuzhiyun local cgroup="$1" 108*4882a593Smuzhiyun local path="/dev/cgroup/memory/$cgroup/hugetlb.${MB}MB.$reservation_usage_file" 109*4882a593Smuzhiyun # Wait for hugetlbfs memory to get depleted. 110*4882a593Smuzhiyun while [ $(cat $path) != 0 ]; do 111*4882a593Smuzhiyun echo Waiting for hugetlb memory to get depleted. 112*4882a593Smuzhiyun cat $path 113*4882a593Smuzhiyun sleep 0.5 114*4882a593Smuzhiyun done 115*4882a593Smuzhiyun} 116*4882a593Smuzhiyun 117*4882a593Smuzhiyunfunction wait_for_hugetlb_memory_to_get_reserved() { 118*4882a593Smuzhiyun local cgroup="$1" 119*4882a593Smuzhiyun local size="$2" 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun local path="/dev/cgroup/memory/$cgroup/hugetlb.${MB}MB.$reservation_usage_file" 122*4882a593Smuzhiyun # Wait for hugetlbfs memory to get written. 123*4882a593Smuzhiyun while [ $(cat $path) != $size ]; do 124*4882a593Smuzhiyun echo Waiting for hugetlb memory reservation to reach size $size. 125*4882a593Smuzhiyun cat $path 126*4882a593Smuzhiyun sleep 0.5 127*4882a593Smuzhiyun done 128*4882a593Smuzhiyun} 129*4882a593Smuzhiyun 130*4882a593Smuzhiyunfunction wait_for_hugetlb_memory_to_get_written() { 131*4882a593Smuzhiyun local cgroup="$1" 132*4882a593Smuzhiyun local size="$2" 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun local path="/dev/cgroup/memory/$cgroup/hugetlb.${MB}MB.$fault_usage_file" 135*4882a593Smuzhiyun # Wait for hugetlbfs memory to get written. 136*4882a593Smuzhiyun while [ $(cat $path) != $size ]; do 137*4882a593Smuzhiyun echo Waiting for hugetlb memory to reach size $size. 138*4882a593Smuzhiyun cat $path 139*4882a593Smuzhiyun sleep 0.5 140*4882a593Smuzhiyun done 141*4882a593Smuzhiyun} 142*4882a593Smuzhiyun 143*4882a593Smuzhiyunfunction write_hugetlbfs_and_get_usage() { 144*4882a593Smuzhiyun local cgroup="$1" 145*4882a593Smuzhiyun local size="$2" 146*4882a593Smuzhiyun local populate="$3" 147*4882a593Smuzhiyun local write="$4" 148*4882a593Smuzhiyun local path="$5" 149*4882a593Smuzhiyun local method="$6" 150*4882a593Smuzhiyun local private="$7" 151*4882a593Smuzhiyun local expect_failure="$8" 152*4882a593Smuzhiyun local reserve="$9" 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun # Function return values. 155*4882a593Smuzhiyun reservation_failed=0 156*4882a593Smuzhiyun oom_killed=0 157*4882a593Smuzhiyun hugetlb_difference=0 158*4882a593Smuzhiyun reserved_difference=0 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun local hugetlb_usage=$cgroup_path/$cgroup/hugetlb.${MB}MB.$fault_usage_file 161*4882a593Smuzhiyun local reserved_usage=$cgroup_path/$cgroup/hugetlb.${MB}MB.$reservation_usage_file 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun local hugetlb_before=$(cat $hugetlb_usage) 164*4882a593Smuzhiyun local reserved_before=$(cat $reserved_usage) 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun echo 167*4882a593Smuzhiyun echo Starting: 168*4882a593Smuzhiyun echo hugetlb_usage="$hugetlb_before" 169*4882a593Smuzhiyun echo reserved_usage="$reserved_before" 170*4882a593Smuzhiyun echo expect_failure is "$expect_failure" 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun output=$(mktemp) 173*4882a593Smuzhiyun set +e 174*4882a593Smuzhiyun if [[ "$method" == "1" ]] || [[ "$method" == 2 ]] || 175*4882a593Smuzhiyun [[ "$private" == "-r" ]] && [[ "$expect_failure" != 1 ]]; then 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun bash write_hugetlb_memory.sh "$size" "$populate" "$write" \ 178*4882a593Smuzhiyun "$cgroup" "$path" "$method" "$private" "-l" "$reserve" 2>&1 | tee $output & 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun local write_result=$? 181*4882a593Smuzhiyun local write_pid=$! 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun until grep -q -i "DONE" $output; do 184*4882a593Smuzhiyun echo waiting for DONE signal. 185*4882a593Smuzhiyun if ! ps $write_pid > /dev/null 186*4882a593Smuzhiyun then 187*4882a593Smuzhiyun echo "FAIL: The write died" 188*4882a593Smuzhiyun cleanup 189*4882a593Smuzhiyun exit 1 190*4882a593Smuzhiyun fi 191*4882a593Smuzhiyun sleep 0.5 192*4882a593Smuzhiyun done 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun echo ================= write_hugetlb_memory.sh output is: 195*4882a593Smuzhiyun cat $output 196*4882a593Smuzhiyun echo ================= end output. 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun if [[ "$populate" == "-o" ]] || [[ "$write" == "-w" ]]; then 199*4882a593Smuzhiyun wait_for_hugetlb_memory_to_get_written "$cgroup" "$size" 200*4882a593Smuzhiyun elif [[ "$reserve" != "-n" ]]; then 201*4882a593Smuzhiyun wait_for_hugetlb_memory_to_get_reserved "$cgroup" "$size" 202*4882a593Smuzhiyun else 203*4882a593Smuzhiyun # This case doesn't produce visible effects, but we still have 204*4882a593Smuzhiyun # to wait for the async process to start and execute... 205*4882a593Smuzhiyun sleep 0.5 206*4882a593Smuzhiyun fi 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun echo write_result is $write_result 209*4882a593Smuzhiyun else 210*4882a593Smuzhiyun bash write_hugetlb_memory.sh "$size" "$populate" "$write" \ 211*4882a593Smuzhiyun "$cgroup" "$path" "$method" "$private" "$reserve" 212*4882a593Smuzhiyun local write_result=$? 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun if [[ "$reserve" != "-n" ]]; then 215*4882a593Smuzhiyun wait_for_hugetlb_memory_to_get_reserved "$cgroup" "$size" 216*4882a593Smuzhiyun fi 217*4882a593Smuzhiyun fi 218*4882a593Smuzhiyun set -e 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun if [[ "$write_result" == 1 ]]; then 221*4882a593Smuzhiyun reservation_failed=1 222*4882a593Smuzhiyun fi 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun # On linus/master, the above process gets SIGBUS'd on oomkill, with 225*4882a593Smuzhiyun # return code 135. On earlier kernels, it gets actual oomkill, with return 226*4882a593Smuzhiyun # code 137, so just check for both conditions in case we're testing 227*4882a593Smuzhiyun # against an earlier kernel. 228*4882a593Smuzhiyun if [[ "$write_result" == 135 ]] || [[ "$write_result" == 137 ]]; then 229*4882a593Smuzhiyun oom_killed=1 230*4882a593Smuzhiyun fi 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun local hugetlb_after=$(cat $hugetlb_usage) 233*4882a593Smuzhiyun local reserved_after=$(cat $reserved_usage) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun echo After write: 236*4882a593Smuzhiyun echo hugetlb_usage="$hugetlb_after" 237*4882a593Smuzhiyun echo reserved_usage="$reserved_after" 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun hugetlb_difference=$(($hugetlb_after - $hugetlb_before)) 240*4882a593Smuzhiyun reserved_difference=$(($reserved_after - $reserved_before)) 241*4882a593Smuzhiyun} 242*4882a593Smuzhiyun 243*4882a593Smuzhiyunfunction cleanup_hugetlb_memory() { 244*4882a593Smuzhiyun set +e 245*4882a593Smuzhiyun local cgroup="$1" 246*4882a593Smuzhiyun if [[ "$(pgrep -f write_to_hugetlbfs)" != "" ]]; then 247*4882a593Smuzhiyun echo killing write_to_hugetlbfs 248*4882a593Smuzhiyun killall -2 write_to_hugetlbfs 249*4882a593Smuzhiyun wait_for_hugetlb_memory_to_get_depleted $cgroup 250*4882a593Smuzhiyun fi 251*4882a593Smuzhiyun set -e 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun if [[ -e /mnt/huge ]]; then 254*4882a593Smuzhiyun rm -rf /mnt/huge/* 255*4882a593Smuzhiyun umount /mnt/huge 256*4882a593Smuzhiyun rmdir /mnt/huge 257*4882a593Smuzhiyun fi 258*4882a593Smuzhiyun} 259*4882a593Smuzhiyun 260*4882a593Smuzhiyunfunction run_test() { 261*4882a593Smuzhiyun local size=$(($1 * ${MB} * 1024 * 1024)) 262*4882a593Smuzhiyun local populate="$2" 263*4882a593Smuzhiyun local write="$3" 264*4882a593Smuzhiyun local cgroup_limit=$(($4 * ${MB} * 1024 * 1024)) 265*4882a593Smuzhiyun local reservation_limit=$(($5 * ${MB} * 1024 * 1024)) 266*4882a593Smuzhiyun local nr_hugepages="$6" 267*4882a593Smuzhiyun local method="$7" 268*4882a593Smuzhiyun local private="$8" 269*4882a593Smuzhiyun local expect_failure="$9" 270*4882a593Smuzhiyun local reserve="${10}" 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun # Function return values. 273*4882a593Smuzhiyun hugetlb_difference=0 274*4882a593Smuzhiyun reserved_difference=0 275*4882a593Smuzhiyun reservation_failed=0 276*4882a593Smuzhiyun oom_killed=0 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun echo nr hugepages = "$nr_hugepages" 279*4882a593Smuzhiyun echo "$nr_hugepages" >/proc/sys/vm/nr_hugepages 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun setup_cgroup "hugetlb_cgroup_test" "$cgroup_limit" "$reservation_limit" 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun mkdir -p /mnt/huge 284*4882a593Smuzhiyun mount -t hugetlbfs -o pagesize=${MB}M,size=256M none /mnt/huge 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun write_hugetlbfs_and_get_usage "hugetlb_cgroup_test" "$size" "$populate" \ 287*4882a593Smuzhiyun "$write" "/mnt/huge/test" "$method" "$private" "$expect_failure" \ 288*4882a593Smuzhiyun "$reserve" 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun cleanup_hugetlb_memory "hugetlb_cgroup_test" 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun local final_hugetlb=$(cat $cgroup_path/hugetlb_cgroup_test/hugetlb.${MB}MB.$fault_usage_file) 293*4882a593Smuzhiyun local final_reservation=$(cat $cgroup_path/hugetlb_cgroup_test/hugetlb.${MB}MB.$reservation_usage_file) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun echo $hugetlb_difference 296*4882a593Smuzhiyun echo $reserved_difference 297*4882a593Smuzhiyun expect_equal "0" "$final_hugetlb" "final hugetlb is not zero" 298*4882a593Smuzhiyun expect_equal "0" "$final_reservation" "final reservation is not zero" 299*4882a593Smuzhiyun} 300*4882a593Smuzhiyun 301*4882a593Smuzhiyunfunction run_multiple_cgroup_test() { 302*4882a593Smuzhiyun local size1="$1" 303*4882a593Smuzhiyun local populate1="$2" 304*4882a593Smuzhiyun local write1="$3" 305*4882a593Smuzhiyun local cgroup_limit1="$4" 306*4882a593Smuzhiyun local reservation_limit1="$5" 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun local size2="$6" 309*4882a593Smuzhiyun local populate2="$7" 310*4882a593Smuzhiyun local write2="$8" 311*4882a593Smuzhiyun local cgroup_limit2="$9" 312*4882a593Smuzhiyun local reservation_limit2="${10}" 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun local nr_hugepages="${11}" 315*4882a593Smuzhiyun local method="${12}" 316*4882a593Smuzhiyun local private="${13}" 317*4882a593Smuzhiyun local expect_failure="${14}" 318*4882a593Smuzhiyun local reserve="${15}" 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun # Function return values. 321*4882a593Smuzhiyun hugetlb_difference1=0 322*4882a593Smuzhiyun reserved_difference1=0 323*4882a593Smuzhiyun reservation_failed1=0 324*4882a593Smuzhiyun oom_killed1=0 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun hugetlb_difference2=0 327*4882a593Smuzhiyun reserved_difference2=0 328*4882a593Smuzhiyun reservation_failed2=0 329*4882a593Smuzhiyun oom_killed2=0 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun echo nr hugepages = "$nr_hugepages" 332*4882a593Smuzhiyun echo "$nr_hugepages" >/proc/sys/vm/nr_hugepages 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun setup_cgroup "hugetlb_cgroup_test1" "$cgroup_limit1" "$reservation_limit1" 335*4882a593Smuzhiyun setup_cgroup "hugetlb_cgroup_test2" "$cgroup_limit2" "$reservation_limit2" 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun mkdir -p /mnt/huge 338*4882a593Smuzhiyun mount -t hugetlbfs -o pagesize=${MB}M,size=256M none /mnt/huge 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun write_hugetlbfs_and_get_usage "hugetlb_cgroup_test1" "$size1" \ 341*4882a593Smuzhiyun "$populate1" "$write1" "/mnt/huge/test1" "$method" "$private" \ 342*4882a593Smuzhiyun "$expect_failure" "$reserve" 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun hugetlb_difference1=$hugetlb_difference 345*4882a593Smuzhiyun reserved_difference1=$reserved_difference 346*4882a593Smuzhiyun reservation_failed1=$reservation_failed 347*4882a593Smuzhiyun oom_killed1=$oom_killed 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun local cgroup1_hugetlb_usage=$cgroup_path/hugetlb_cgroup_test1/hugetlb.${MB}MB.$fault_usage_file 350*4882a593Smuzhiyun local cgroup1_reservation_usage=$cgroup_path/hugetlb_cgroup_test1/hugetlb.${MB}MB.$reservation_usage_file 351*4882a593Smuzhiyun local cgroup2_hugetlb_usage=$cgroup_path/hugetlb_cgroup_test2/hugetlb.${MB}MB.$fault_usage_file 352*4882a593Smuzhiyun local cgroup2_reservation_usage=$cgroup_path/hugetlb_cgroup_test2/hugetlb.${MB}MB.$reservation_usage_file 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun local usage_before_second_write=$(cat $cgroup1_hugetlb_usage) 355*4882a593Smuzhiyun local reservation_usage_before_second_write=$(cat $cgroup1_reservation_usage) 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun write_hugetlbfs_and_get_usage "hugetlb_cgroup_test2" "$size2" \ 358*4882a593Smuzhiyun "$populate2" "$write2" "/mnt/huge/test2" "$method" "$private" \ 359*4882a593Smuzhiyun "$expect_failure" "$reserve" 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun hugetlb_difference2=$hugetlb_difference 362*4882a593Smuzhiyun reserved_difference2=$reserved_difference 363*4882a593Smuzhiyun reservation_failed2=$reservation_failed 364*4882a593Smuzhiyun oom_killed2=$oom_killed 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun expect_equal "$usage_before_second_write" \ 367*4882a593Smuzhiyun "$(cat $cgroup1_hugetlb_usage)" "Usage changed." 368*4882a593Smuzhiyun expect_equal "$reservation_usage_before_second_write" \ 369*4882a593Smuzhiyun "$(cat $cgroup1_reservation_usage)" "Reservation usage changed." 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun cleanup_hugetlb_memory 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun local final_hugetlb=$(cat $cgroup1_hugetlb_usage) 374*4882a593Smuzhiyun local final_reservation=$(cat $cgroup1_reservation_usage) 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun expect_equal "0" "$final_hugetlb" \ 377*4882a593Smuzhiyun "hugetlbt_cgroup_test1 final hugetlb is not zero" 378*4882a593Smuzhiyun expect_equal "0" "$final_reservation" \ 379*4882a593Smuzhiyun "hugetlbt_cgroup_test1 final reservation is not zero" 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun local final_hugetlb=$(cat $cgroup2_hugetlb_usage) 382*4882a593Smuzhiyun local final_reservation=$(cat $cgroup2_reservation_usage) 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun expect_equal "0" "$final_hugetlb" \ 385*4882a593Smuzhiyun "hugetlb_cgroup_test2 final hugetlb is not zero" 386*4882a593Smuzhiyun expect_equal "0" "$final_reservation" \ 387*4882a593Smuzhiyun "hugetlb_cgroup_test2 final reservation is not zero" 388*4882a593Smuzhiyun} 389*4882a593Smuzhiyun 390*4882a593Smuzhiyuncleanup 391*4882a593Smuzhiyun 392*4882a593Smuzhiyunfor populate in "" "-o"; do 393*4882a593Smuzhiyun for method in 0 1 2; do 394*4882a593Smuzhiyun for private in "" "-r"; do 395*4882a593Smuzhiyun for reserve in "" "-n"; do 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun # Skip mmap(MAP_HUGETLB | MAP_SHARED). Doesn't seem to be supported. 398*4882a593Smuzhiyun if [[ "$method" == 1 ]] && [[ "$private" == "" ]]; then 399*4882a593Smuzhiyun continue 400*4882a593Smuzhiyun fi 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun # Skip populated shmem tests. Doesn't seem to be supported. 403*4882a593Smuzhiyun if [[ "$method" == 2"" ]] && [[ "$populate" == "-o" ]]; then 404*4882a593Smuzhiyun continue 405*4882a593Smuzhiyun fi 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun if [[ "$method" == 2"" ]] && [[ "$reserve" == "-n" ]]; then 408*4882a593Smuzhiyun continue 409*4882a593Smuzhiyun fi 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun cleanup 412*4882a593Smuzhiyun echo 413*4882a593Smuzhiyun echo 414*4882a593Smuzhiyun echo 415*4882a593Smuzhiyun echo Test normal case. 416*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 417*4882a593Smuzhiyun run_test 5 "$populate" "" 10 10 10 "$method" "$private" "0" "$reserve" 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun echo Memory charged to hugtlb=$hugetlb_difference 420*4882a593Smuzhiyun echo Memory charged to reservation=$reserved_difference 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun if [[ "$populate" == "-o" ]]; then 423*4882a593Smuzhiyun expect_equal "$((5 * $MB * 1024 * 1024))" "$hugetlb_difference" \ 424*4882a593Smuzhiyun "Reserved memory charged to hugetlb cgroup." 425*4882a593Smuzhiyun else 426*4882a593Smuzhiyun expect_equal "0" "$hugetlb_difference" \ 427*4882a593Smuzhiyun "Reserved memory charged to hugetlb cgroup." 428*4882a593Smuzhiyun fi 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun if [[ "$reserve" != "-n" ]] || [[ "$populate" == "-o" ]]; then 431*4882a593Smuzhiyun expect_equal "$((5 * $MB * 1024 * 1024))" "$reserved_difference" \ 432*4882a593Smuzhiyun "Reserved memory not charged to reservation usage." 433*4882a593Smuzhiyun else 434*4882a593Smuzhiyun expect_equal "0" "$reserved_difference" \ 435*4882a593Smuzhiyun "Reserved memory not charged to reservation usage." 436*4882a593Smuzhiyun fi 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun echo 'PASS' 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun cleanup 441*4882a593Smuzhiyun echo 442*4882a593Smuzhiyun echo 443*4882a593Smuzhiyun echo 444*4882a593Smuzhiyun echo Test normal case with write. 445*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 446*4882a593Smuzhiyun run_test 5 "$populate" '-w' 5 5 10 "$method" "$private" "0" "$reserve" 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun echo Memory charged to hugtlb=$hugetlb_difference 449*4882a593Smuzhiyun echo Memory charged to reservation=$reserved_difference 450*4882a593Smuzhiyun 451*4882a593Smuzhiyun expect_equal "$((5 * $MB * 1024 * 1024))" "$hugetlb_difference" \ 452*4882a593Smuzhiyun "Reserved memory charged to hugetlb cgroup." 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun expect_equal "$((5 * $MB * 1024 * 1024))" "$reserved_difference" \ 455*4882a593Smuzhiyun "Reserved memory not charged to reservation usage." 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun echo 'PASS' 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun cleanup 460*4882a593Smuzhiyun continue 461*4882a593Smuzhiyun echo 462*4882a593Smuzhiyun echo 463*4882a593Smuzhiyun echo 464*4882a593Smuzhiyun echo Test more than reservation case. 465*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun if [ "$reserve" != "-n" ]; then 468*4882a593Smuzhiyun run_test "5" "$populate" '' "10" "2" "10" "$method" "$private" "1" \ 469*4882a593Smuzhiyun "$reserve" 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun expect_equal "1" "$reservation_failed" "Reservation succeeded." 472*4882a593Smuzhiyun fi 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun echo 'PASS' 475*4882a593Smuzhiyun 476*4882a593Smuzhiyun cleanup 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun echo 479*4882a593Smuzhiyun echo 480*4882a593Smuzhiyun echo 481*4882a593Smuzhiyun echo Test more than cgroup limit case. 482*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun # Not sure if shm memory can be cleaned up when the process gets sigbus'd. 485*4882a593Smuzhiyun if [[ "$method" != 2 ]]; then 486*4882a593Smuzhiyun run_test 5 "$populate" "-w" 2 10 10 "$method" "$private" "1" "$reserve" 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun expect_equal "1" "$oom_killed" "Not oom killed." 489*4882a593Smuzhiyun fi 490*4882a593Smuzhiyun echo 'PASS' 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun cleanup 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun echo 495*4882a593Smuzhiyun echo 496*4882a593Smuzhiyun echo 497*4882a593Smuzhiyun echo Test normal case, multiple cgroups. 498*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 499*4882a593Smuzhiyun run_multiple_cgroup_test "3" "$populate" "" "10" "10" "5" \ 500*4882a593Smuzhiyun "$populate" "" "10" "10" "10" \ 501*4882a593Smuzhiyun "$method" "$private" "0" "$reserve" 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun echo Memory charged to hugtlb1=$hugetlb_difference1 504*4882a593Smuzhiyun echo Memory charged to reservation1=$reserved_difference1 505*4882a593Smuzhiyun echo Memory charged to hugtlb2=$hugetlb_difference2 506*4882a593Smuzhiyun echo Memory charged to reservation2=$reserved_difference2 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun if [[ "$reserve" != "-n" ]] || [[ "$populate" == "-o" ]]; then 509*4882a593Smuzhiyun expect_equal "3" "$reserved_difference1" \ 510*4882a593Smuzhiyun "Incorrect reservations charged to cgroup 1." 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun expect_equal "5" "$reserved_difference2" \ 513*4882a593Smuzhiyun "Incorrect reservation charged to cgroup 2." 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun else 516*4882a593Smuzhiyun expect_equal "0" "$reserved_difference1" \ 517*4882a593Smuzhiyun "Incorrect reservations charged to cgroup 1." 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun expect_equal "0" "$reserved_difference2" \ 520*4882a593Smuzhiyun "Incorrect reservation charged to cgroup 2." 521*4882a593Smuzhiyun fi 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun if [[ "$populate" == "-o" ]]; then 524*4882a593Smuzhiyun expect_equal "3" "$hugetlb_difference1" \ 525*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 1." 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun expect_equal "5" "$hugetlb_difference2" \ 528*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 2." 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun else 531*4882a593Smuzhiyun expect_equal "0" "$hugetlb_difference1" \ 532*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 1." 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun expect_equal "0" "$hugetlb_difference2" \ 535*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 2." 536*4882a593Smuzhiyun fi 537*4882a593Smuzhiyun echo 'PASS' 538*4882a593Smuzhiyun 539*4882a593Smuzhiyun cleanup 540*4882a593Smuzhiyun echo 541*4882a593Smuzhiyun echo 542*4882a593Smuzhiyun echo 543*4882a593Smuzhiyun echo Test normal case with write, multiple cgroups. 544*4882a593Smuzhiyun echo private=$private, populate=$populate, method=$method, reserve=$reserve 545*4882a593Smuzhiyun run_multiple_cgroup_test "3" "$populate" "-w" "10" "10" "5" \ 546*4882a593Smuzhiyun "$populate" "-w" "10" "10" "10" \ 547*4882a593Smuzhiyun "$method" "$private" "0" "$reserve" 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun echo Memory charged to hugtlb1=$hugetlb_difference1 550*4882a593Smuzhiyun echo Memory charged to reservation1=$reserved_difference1 551*4882a593Smuzhiyun echo Memory charged to hugtlb2=$hugetlb_difference2 552*4882a593Smuzhiyun echo Memory charged to reservation2=$reserved_difference2 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun expect_equal "3" "$hugetlb_difference1" \ 555*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 1." 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun expect_equal "3" "$reserved_difference1" \ 558*4882a593Smuzhiyun "Incorrect reservation charged to cgroup 1." 559*4882a593Smuzhiyun 560*4882a593Smuzhiyun expect_equal "5" "$hugetlb_difference2" \ 561*4882a593Smuzhiyun "Incorrect hugetlb charged to cgroup 2." 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun expect_equal "5" "$reserved_difference2" \ 564*4882a593Smuzhiyun "Incorrected reservation charged to cgroup 2." 565*4882a593Smuzhiyun echo 'PASS' 566*4882a593Smuzhiyun 567*4882a593Smuzhiyun cleanup 568*4882a593Smuzhiyun 569*4882a593Smuzhiyun done # reserve 570*4882a593Smuzhiyun done # private 571*4882a593Smuzhiyun done # populate 572*4882a593Smuzhiyundone # method 573*4882a593Smuzhiyun 574*4882a593Smuzhiyunumount $cgroup_path 575*4882a593Smuzhiyunrmdir $cgroup_path 576