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