162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4. 562306a36Sopenharmony_ciksft_skip=4 662306a36Sopenharmony_ci 762306a36Sopenharmony_ciset -e 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciif [[ $(id -u) -ne 0 ]]; then 1062306a36Sopenharmony_ci echo "This test must be run as root. Skipping..." 1162306a36Sopenharmony_ci exit $ksft_skip 1262306a36Sopenharmony_cifi 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cifault_limit_file=limit_in_bytes 1562306a36Sopenharmony_cireservation_limit_file=rsvd.limit_in_bytes 1662306a36Sopenharmony_cifault_usage_file=usage_in_bytes 1762306a36Sopenharmony_cireservation_usage_file=rsvd.usage_in_bytes 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciif [[ "$1" == "-cgroup-v2" ]]; then 2062306a36Sopenharmony_ci cgroup2=1 2162306a36Sopenharmony_ci fault_limit_file=max 2262306a36Sopenharmony_ci reservation_limit_file=rsvd.max 2362306a36Sopenharmony_ci fault_usage_file=current 2462306a36Sopenharmony_ci reservation_usage_file=rsvd.current 2562306a36Sopenharmony_cifi 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciif [[ $cgroup2 ]]; then 2862306a36Sopenharmony_ci cgroup_path=$(mount -t cgroup2 | head -1 | awk '{print $3}') 2962306a36Sopenharmony_ci if [[ -z "$cgroup_path" ]]; then 3062306a36Sopenharmony_ci cgroup_path=/dev/cgroup/memory 3162306a36Sopenharmony_ci mount -t cgroup2 none $cgroup_path 3262306a36Sopenharmony_ci do_umount=1 3362306a36Sopenharmony_ci fi 3462306a36Sopenharmony_ci echo "+hugetlb" >$cgroup_path/cgroup.subtree_control 3562306a36Sopenharmony_cielse 3662306a36Sopenharmony_ci cgroup_path=$(mount -t cgroup | grep ",hugetlb" | awk '{print $3}') 3762306a36Sopenharmony_ci if [[ -z "$cgroup_path" ]]; then 3862306a36Sopenharmony_ci cgroup_path=/dev/cgroup/memory 3962306a36Sopenharmony_ci mount -t cgroup memory,hugetlb $cgroup_path 4062306a36Sopenharmony_ci do_umount=1 4162306a36Sopenharmony_ci fi 4262306a36Sopenharmony_cifi 4362306a36Sopenharmony_ciexport cgroup_path 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cifunction cleanup() { 4662306a36Sopenharmony_ci if [[ $cgroup2 ]]; then 4762306a36Sopenharmony_ci echo $$ >$cgroup_path/cgroup.procs 4862306a36Sopenharmony_ci else 4962306a36Sopenharmony_ci echo $$ >$cgroup_path/tasks 5062306a36Sopenharmony_ci fi 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci if [[ -e /mnt/huge ]]; then 5362306a36Sopenharmony_ci rm -rf /mnt/huge/* 5462306a36Sopenharmony_ci umount /mnt/huge || echo error 5562306a36Sopenharmony_ci rmdir /mnt/huge 5662306a36Sopenharmony_ci fi 5762306a36Sopenharmony_ci if [[ -e $cgroup_path/hugetlb_cgroup_test ]]; then 5862306a36Sopenharmony_ci rmdir $cgroup_path/hugetlb_cgroup_test 5962306a36Sopenharmony_ci fi 6062306a36Sopenharmony_ci if [[ -e $cgroup_path/hugetlb_cgroup_test1 ]]; then 6162306a36Sopenharmony_ci rmdir $cgroup_path/hugetlb_cgroup_test1 6262306a36Sopenharmony_ci fi 6362306a36Sopenharmony_ci if [[ -e $cgroup_path/hugetlb_cgroup_test2 ]]; then 6462306a36Sopenharmony_ci rmdir $cgroup_path/hugetlb_cgroup_test2 6562306a36Sopenharmony_ci fi 6662306a36Sopenharmony_ci echo 0 >/proc/sys/vm/nr_hugepages 6762306a36Sopenharmony_ci echo CLEANUP DONE 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cifunction expect_equal() { 7162306a36Sopenharmony_ci local expected="$1" 7262306a36Sopenharmony_ci local actual="$2" 7362306a36Sopenharmony_ci local error="$3" 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci if [[ "$expected" != "$actual" ]]; then 7662306a36Sopenharmony_ci echo "expected ($expected) != actual ($actual): $3" 7762306a36Sopenharmony_ci cleanup 7862306a36Sopenharmony_ci exit 1 7962306a36Sopenharmony_ci fi 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cifunction get_machine_hugepage_size() { 8362306a36Sopenharmony_ci hpz=$(grep -i hugepagesize /proc/meminfo) 8462306a36Sopenharmony_ci kb=${hpz:14:-3} 8562306a36Sopenharmony_ci mb=$(($kb / 1024)) 8662306a36Sopenharmony_ci echo $mb 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciMB=$(get_machine_hugepage_size) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cifunction setup_cgroup() { 9262306a36Sopenharmony_ci local name="$1" 9362306a36Sopenharmony_ci local cgroup_limit="$2" 9462306a36Sopenharmony_ci local reservation_limit="$3" 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci mkdir $cgroup_path/$name 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci echo writing cgroup limit: "$cgroup_limit" 9962306a36Sopenharmony_ci echo "$cgroup_limit" >$cgroup_path/$name/hugetlb.${MB}MB.$fault_limit_file 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci echo writing reseravation limit: "$reservation_limit" 10262306a36Sopenharmony_ci echo "$reservation_limit" > \ 10362306a36Sopenharmony_ci $cgroup_path/$name/hugetlb.${MB}MB.$reservation_limit_file 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci if [ -e "$cgroup_path/$name/cpuset.cpus" ]; then 10662306a36Sopenharmony_ci echo 0 >$cgroup_path/$name/cpuset.cpus 10762306a36Sopenharmony_ci fi 10862306a36Sopenharmony_ci if [ -e "$cgroup_path/$name/cpuset.mems" ]; then 10962306a36Sopenharmony_ci echo 0 >$cgroup_path/$name/cpuset.mems 11062306a36Sopenharmony_ci fi 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cifunction wait_for_hugetlb_memory_to_get_depleted() { 11462306a36Sopenharmony_ci local cgroup="$1" 11562306a36Sopenharmony_ci local path="$cgroup_path/$cgroup/hugetlb.${MB}MB.$reservation_usage_file" 11662306a36Sopenharmony_ci # Wait for hugetlbfs memory to get depleted. 11762306a36Sopenharmony_ci while [ $(cat $path) != 0 ]; do 11862306a36Sopenharmony_ci echo Waiting for hugetlb memory to get depleted. 11962306a36Sopenharmony_ci cat $path 12062306a36Sopenharmony_ci sleep 0.5 12162306a36Sopenharmony_ci done 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cifunction wait_for_hugetlb_memory_to_get_reserved() { 12562306a36Sopenharmony_ci local cgroup="$1" 12662306a36Sopenharmony_ci local size="$2" 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci local path="$cgroup_path/$cgroup/hugetlb.${MB}MB.$reservation_usage_file" 12962306a36Sopenharmony_ci # Wait for hugetlbfs memory to get written. 13062306a36Sopenharmony_ci while [ $(cat $path) != $size ]; do 13162306a36Sopenharmony_ci echo Waiting for hugetlb memory reservation to reach size $size. 13262306a36Sopenharmony_ci cat $path 13362306a36Sopenharmony_ci sleep 0.5 13462306a36Sopenharmony_ci done 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cifunction wait_for_hugetlb_memory_to_get_written() { 13862306a36Sopenharmony_ci local cgroup="$1" 13962306a36Sopenharmony_ci local size="$2" 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci local path="$cgroup_path/$cgroup/hugetlb.${MB}MB.$fault_usage_file" 14262306a36Sopenharmony_ci # Wait for hugetlbfs memory to get written. 14362306a36Sopenharmony_ci while [ $(cat $path) != $size ]; do 14462306a36Sopenharmony_ci echo Waiting for hugetlb memory to reach size $size. 14562306a36Sopenharmony_ci cat $path 14662306a36Sopenharmony_ci sleep 0.5 14762306a36Sopenharmony_ci done 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cifunction write_hugetlbfs_and_get_usage() { 15162306a36Sopenharmony_ci local cgroup="$1" 15262306a36Sopenharmony_ci local size="$2" 15362306a36Sopenharmony_ci local populate="$3" 15462306a36Sopenharmony_ci local write="$4" 15562306a36Sopenharmony_ci local path="$5" 15662306a36Sopenharmony_ci local method="$6" 15762306a36Sopenharmony_ci local private="$7" 15862306a36Sopenharmony_ci local expect_failure="$8" 15962306a36Sopenharmony_ci local reserve="$9" 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci # Function return values. 16262306a36Sopenharmony_ci reservation_failed=0 16362306a36Sopenharmony_ci oom_killed=0 16462306a36Sopenharmony_ci hugetlb_difference=0 16562306a36Sopenharmony_ci reserved_difference=0 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci local hugetlb_usage=$cgroup_path/$cgroup/hugetlb.${MB}MB.$fault_usage_file 16862306a36Sopenharmony_ci local reserved_usage=$cgroup_path/$cgroup/hugetlb.${MB}MB.$reservation_usage_file 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci local hugetlb_before=$(cat $hugetlb_usage) 17162306a36Sopenharmony_ci local reserved_before=$(cat $reserved_usage) 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci echo 17462306a36Sopenharmony_ci echo Starting: 17562306a36Sopenharmony_ci echo hugetlb_usage="$hugetlb_before" 17662306a36Sopenharmony_ci echo reserved_usage="$reserved_before" 17762306a36Sopenharmony_ci echo expect_failure is "$expect_failure" 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci output=$(mktemp) 18062306a36Sopenharmony_ci set +e 18162306a36Sopenharmony_ci if [[ "$method" == "1" ]] || [[ "$method" == 2 ]] || 18262306a36Sopenharmony_ci [[ "$private" == "-r" ]] && [[ "$expect_failure" != 1 ]]; then 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci bash write_hugetlb_memory.sh "$size" "$populate" "$write" \ 18562306a36Sopenharmony_ci "$cgroup" "$path" "$method" "$private" "-l" "$reserve" 2>&1 | tee $output & 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci local write_result=$? 18862306a36Sopenharmony_ci local write_pid=$! 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci until grep -q -i "DONE" $output; do 19162306a36Sopenharmony_ci echo waiting for DONE signal. 19262306a36Sopenharmony_ci if ! ps $write_pid > /dev/null 19362306a36Sopenharmony_ci then 19462306a36Sopenharmony_ci echo "FAIL: The write died" 19562306a36Sopenharmony_ci cleanup 19662306a36Sopenharmony_ci exit 1 19762306a36Sopenharmony_ci fi 19862306a36Sopenharmony_ci sleep 0.5 19962306a36Sopenharmony_ci done 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci echo ================= write_hugetlb_memory.sh output is: 20262306a36Sopenharmony_ci cat $output 20362306a36Sopenharmony_ci echo ================= end output. 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci if [[ "$populate" == "-o" ]] || [[ "$write" == "-w" ]]; then 20662306a36Sopenharmony_ci wait_for_hugetlb_memory_to_get_written "$cgroup" "$size" 20762306a36Sopenharmony_ci elif [[ "$reserve" != "-n" ]]; then 20862306a36Sopenharmony_ci wait_for_hugetlb_memory_to_get_reserved "$cgroup" "$size" 20962306a36Sopenharmony_ci else 21062306a36Sopenharmony_ci # This case doesn't produce visible effects, but we still have 21162306a36Sopenharmony_ci # to wait for the async process to start and execute... 21262306a36Sopenharmony_ci sleep 0.5 21362306a36Sopenharmony_ci fi 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci echo write_result is $write_result 21662306a36Sopenharmony_ci else 21762306a36Sopenharmony_ci bash write_hugetlb_memory.sh "$size" "$populate" "$write" \ 21862306a36Sopenharmony_ci "$cgroup" "$path" "$method" "$private" "$reserve" 21962306a36Sopenharmony_ci local write_result=$? 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci if [[ "$reserve" != "-n" ]]; then 22262306a36Sopenharmony_ci wait_for_hugetlb_memory_to_get_reserved "$cgroup" "$size" 22362306a36Sopenharmony_ci fi 22462306a36Sopenharmony_ci fi 22562306a36Sopenharmony_ci set -e 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci if [[ "$write_result" == 1 ]]; then 22862306a36Sopenharmony_ci reservation_failed=1 22962306a36Sopenharmony_ci fi 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci # On linus/master, the above process gets SIGBUS'd on oomkill, with 23262306a36Sopenharmony_ci # return code 135. On earlier kernels, it gets actual oomkill, with return 23362306a36Sopenharmony_ci # code 137, so just check for both conditions in case we're testing 23462306a36Sopenharmony_ci # against an earlier kernel. 23562306a36Sopenharmony_ci if [[ "$write_result" == 135 ]] || [[ "$write_result" == 137 ]]; then 23662306a36Sopenharmony_ci oom_killed=1 23762306a36Sopenharmony_ci fi 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci local hugetlb_after=$(cat $hugetlb_usage) 24062306a36Sopenharmony_ci local reserved_after=$(cat $reserved_usage) 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci echo After write: 24362306a36Sopenharmony_ci echo hugetlb_usage="$hugetlb_after" 24462306a36Sopenharmony_ci echo reserved_usage="$reserved_after" 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci hugetlb_difference=$(($hugetlb_after - $hugetlb_before)) 24762306a36Sopenharmony_ci reserved_difference=$(($reserved_after - $reserved_before)) 24862306a36Sopenharmony_ci} 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cifunction cleanup_hugetlb_memory() { 25162306a36Sopenharmony_ci set +e 25262306a36Sopenharmony_ci local cgroup="$1" 25362306a36Sopenharmony_ci if [[ "$(pgrep -f write_to_hugetlbfs)" != "" ]]; then 25462306a36Sopenharmony_ci echo killing write_to_hugetlbfs 25562306a36Sopenharmony_ci killall -2 write_to_hugetlbfs 25662306a36Sopenharmony_ci wait_for_hugetlb_memory_to_get_depleted $cgroup 25762306a36Sopenharmony_ci fi 25862306a36Sopenharmony_ci set -e 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci if [[ -e /mnt/huge ]]; then 26162306a36Sopenharmony_ci rm -rf /mnt/huge/* 26262306a36Sopenharmony_ci umount /mnt/huge 26362306a36Sopenharmony_ci rmdir /mnt/huge 26462306a36Sopenharmony_ci fi 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cifunction run_test() { 26862306a36Sopenharmony_ci local size=$(($1 * ${MB} * 1024 * 1024)) 26962306a36Sopenharmony_ci local populate="$2" 27062306a36Sopenharmony_ci local write="$3" 27162306a36Sopenharmony_ci local cgroup_limit=$(($4 * ${MB} * 1024 * 1024)) 27262306a36Sopenharmony_ci local reservation_limit=$(($5 * ${MB} * 1024 * 1024)) 27362306a36Sopenharmony_ci local nr_hugepages="$6" 27462306a36Sopenharmony_ci local method="$7" 27562306a36Sopenharmony_ci local private="$8" 27662306a36Sopenharmony_ci local expect_failure="$9" 27762306a36Sopenharmony_ci local reserve="${10}" 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci # Function return values. 28062306a36Sopenharmony_ci hugetlb_difference=0 28162306a36Sopenharmony_ci reserved_difference=0 28262306a36Sopenharmony_ci reservation_failed=0 28362306a36Sopenharmony_ci oom_killed=0 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci echo nr hugepages = "$nr_hugepages" 28662306a36Sopenharmony_ci echo "$nr_hugepages" >/proc/sys/vm/nr_hugepages 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci setup_cgroup "hugetlb_cgroup_test" "$cgroup_limit" "$reservation_limit" 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci mkdir -p /mnt/huge 29162306a36Sopenharmony_ci mount -t hugetlbfs -o pagesize=${MB}M,size=256M none /mnt/huge 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci write_hugetlbfs_and_get_usage "hugetlb_cgroup_test" "$size" "$populate" \ 29462306a36Sopenharmony_ci "$write" "/mnt/huge/test" "$method" "$private" "$expect_failure" \ 29562306a36Sopenharmony_ci "$reserve" 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci cleanup_hugetlb_memory "hugetlb_cgroup_test" 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci local final_hugetlb=$(cat $cgroup_path/hugetlb_cgroup_test/hugetlb.${MB}MB.$fault_usage_file) 30062306a36Sopenharmony_ci local final_reservation=$(cat $cgroup_path/hugetlb_cgroup_test/hugetlb.${MB}MB.$reservation_usage_file) 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci echo $hugetlb_difference 30362306a36Sopenharmony_ci echo $reserved_difference 30462306a36Sopenharmony_ci expect_equal "0" "$final_hugetlb" "final hugetlb is not zero" 30562306a36Sopenharmony_ci expect_equal "0" "$final_reservation" "final reservation is not zero" 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cifunction run_multiple_cgroup_test() { 30962306a36Sopenharmony_ci local size1="$1" 31062306a36Sopenharmony_ci local populate1="$2" 31162306a36Sopenharmony_ci local write1="$3" 31262306a36Sopenharmony_ci local cgroup_limit1="$4" 31362306a36Sopenharmony_ci local reservation_limit1="$5" 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci local size2="$6" 31662306a36Sopenharmony_ci local populate2="$7" 31762306a36Sopenharmony_ci local write2="$8" 31862306a36Sopenharmony_ci local cgroup_limit2="$9" 31962306a36Sopenharmony_ci local reservation_limit2="${10}" 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci local nr_hugepages="${11}" 32262306a36Sopenharmony_ci local method="${12}" 32362306a36Sopenharmony_ci local private="${13}" 32462306a36Sopenharmony_ci local expect_failure="${14}" 32562306a36Sopenharmony_ci local reserve="${15}" 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci # Function return values. 32862306a36Sopenharmony_ci hugetlb_difference1=0 32962306a36Sopenharmony_ci reserved_difference1=0 33062306a36Sopenharmony_ci reservation_failed1=0 33162306a36Sopenharmony_ci oom_killed1=0 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci hugetlb_difference2=0 33462306a36Sopenharmony_ci reserved_difference2=0 33562306a36Sopenharmony_ci reservation_failed2=0 33662306a36Sopenharmony_ci oom_killed2=0 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci echo nr hugepages = "$nr_hugepages" 33962306a36Sopenharmony_ci echo "$nr_hugepages" >/proc/sys/vm/nr_hugepages 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci setup_cgroup "hugetlb_cgroup_test1" "$cgroup_limit1" "$reservation_limit1" 34262306a36Sopenharmony_ci setup_cgroup "hugetlb_cgroup_test2" "$cgroup_limit2" "$reservation_limit2" 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci mkdir -p /mnt/huge 34562306a36Sopenharmony_ci mount -t hugetlbfs -o pagesize=${MB}M,size=256M none /mnt/huge 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci write_hugetlbfs_and_get_usage "hugetlb_cgroup_test1" "$size1" \ 34862306a36Sopenharmony_ci "$populate1" "$write1" "/mnt/huge/test1" "$method" "$private" \ 34962306a36Sopenharmony_ci "$expect_failure" "$reserve" 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci hugetlb_difference1=$hugetlb_difference 35262306a36Sopenharmony_ci reserved_difference1=$reserved_difference 35362306a36Sopenharmony_ci reservation_failed1=$reservation_failed 35462306a36Sopenharmony_ci oom_killed1=$oom_killed 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci local cgroup1_hugetlb_usage=$cgroup_path/hugetlb_cgroup_test1/hugetlb.${MB}MB.$fault_usage_file 35762306a36Sopenharmony_ci local cgroup1_reservation_usage=$cgroup_path/hugetlb_cgroup_test1/hugetlb.${MB}MB.$reservation_usage_file 35862306a36Sopenharmony_ci local cgroup2_hugetlb_usage=$cgroup_path/hugetlb_cgroup_test2/hugetlb.${MB}MB.$fault_usage_file 35962306a36Sopenharmony_ci local cgroup2_reservation_usage=$cgroup_path/hugetlb_cgroup_test2/hugetlb.${MB}MB.$reservation_usage_file 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci local usage_before_second_write=$(cat $cgroup1_hugetlb_usage) 36262306a36Sopenharmony_ci local reservation_usage_before_second_write=$(cat $cgroup1_reservation_usage) 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci write_hugetlbfs_and_get_usage "hugetlb_cgroup_test2" "$size2" \ 36562306a36Sopenharmony_ci "$populate2" "$write2" "/mnt/huge/test2" "$method" "$private" \ 36662306a36Sopenharmony_ci "$expect_failure" "$reserve" 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci hugetlb_difference2=$hugetlb_difference 36962306a36Sopenharmony_ci reserved_difference2=$reserved_difference 37062306a36Sopenharmony_ci reservation_failed2=$reservation_failed 37162306a36Sopenharmony_ci oom_killed2=$oom_killed 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci expect_equal "$usage_before_second_write" \ 37462306a36Sopenharmony_ci "$(cat $cgroup1_hugetlb_usage)" "Usage changed." 37562306a36Sopenharmony_ci expect_equal "$reservation_usage_before_second_write" \ 37662306a36Sopenharmony_ci "$(cat $cgroup1_reservation_usage)" "Reservation usage changed." 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci cleanup_hugetlb_memory 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci local final_hugetlb=$(cat $cgroup1_hugetlb_usage) 38162306a36Sopenharmony_ci local final_reservation=$(cat $cgroup1_reservation_usage) 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci expect_equal "0" "$final_hugetlb" \ 38462306a36Sopenharmony_ci "hugetlbt_cgroup_test1 final hugetlb is not zero" 38562306a36Sopenharmony_ci expect_equal "0" "$final_reservation" \ 38662306a36Sopenharmony_ci "hugetlbt_cgroup_test1 final reservation is not zero" 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci local final_hugetlb=$(cat $cgroup2_hugetlb_usage) 38962306a36Sopenharmony_ci local final_reservation=$(cat $cgroup2_reservation_usage) 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci expect_equal "0" "$final_hugetlb" \ 39262306a36Sopenharmony_ci "hugetlb_cgroup_test2 final hugetlb is not zero" 39362306a36Sopenharmony_ci expect_equal "0" "$final_reservation" \ 39462306a36Sopenharmony_ci "hugetlb_cgroup_test2 final reservation is not zero" 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cicleanup 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cifor populate in "" "-o"; do 40062306a36Sopenharmony_ci for method in 0 1 2; do 40162306a36Sopenharmony_ci for private in "" "-r"; do 40262306a36Sopenharmony_ci for reserve in "" "-n"; do 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci # Skip mmap(MAP_HUGETLB | MAP_SHARED). Doesn't seem to be supported. 40562306a36Sopenharmony_ci if [[ "$method" == 1 ]] && [[ "$private" == "" ]]; then 40662306a36Sopenharmony_ci continue 40762306a36Sopenharmony_ci fi 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci # Skip populated shmem tests. Doesn't seem to be supported. 41062306a36Sopenharmony_ci if [[ "$method" == 2"" ]] && [[ "$populate" == "-o" ]]; then 41162306a36Sopenharmony_ci continue 41262306a36Sopenharmony_ci fi 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci if [[ "$method" == 2"" ]] && [[ "$reserve" == "-n" ]]; then 41562306a36Sopenharmony_ci continue 41662306a36Sopenharmony_ci fi 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci cleanup 41962306a36Sopenharmony_ci echo 42062306a36Sopenharmony_ci echo 42162306a36Sopenharmony_ci echo 42262306a36Sopenharmony_ci echo Test normal case. 42362306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 42462306a36Sopenharmony_ci run_test 5 "$populate" "" 10 10 10 "$method" "$private" "0" "$reserve" 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci echo Memory charged to hugtlb=$hugetlb_difference 42762306a36Sopenharmony_ci echo Memory charged to reservation=$reserved_difference 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci if [[ "$populate" == "-o" ]]; then 43062306a36Sopenharmony_ci expect_equal "$((5 * $MB * 1024 * 1024))" "$hugetlb_difference" \ 43162306a36Sopenharmony_ci "Reserved memory charged to hugetlb cgroup." 43262306a36Sopenharmony_ci else 43362306a36Sopenharmony_ci expect_equal "0" "$hugetlb_difference" \ 43462306a36Sopenharmony_ci "Reserved memory charged to hugetlb cgroup." 43562306a36Sopenharmony_ci fi 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci if [[ "$reserve" != "-n" ]] || [[ "$populate" == "-o" ]]; then 43862306a36Sopenharmony_ci expect_equal "$((5 * $MB * 1024 * 1024))" "$reserved_difference" \ 43962306a36Sopenharmony_ci "Reserved memory not charged to reservation usage." 44062306a36Sopenharmony_ci else 44162306a36Sopenharmony_ci expect_equal "0" "$reserved_difference" \ 44262306a36Sopenharmony_ci "Reserved memory not charged to reservation usage." 44362306a36Sopenharmony_ci fi 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci echo 'PASS' 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci cleanup 44862306a36Sopenharmony_ci echo 44962306a36Sopenharmony_ci echo 45062306a36Sopenharmony_ci echo 45162306a36Sopenharmony_ci echo Test normal case with write. 45262306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 45362306a36Sopenharmony_ci run_test 5 "$populate" '-w' 5 5 10 "$method" "$private" "0" "$reserve" 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci echo Memory charged to hugtlb=$hugetlb_difference 45662306a36Sopenharmony_ci echo Memory charged to reservation=$reserved_difference 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci expect_equal "$((5 * $MB * 1024 * 1024))" "$hugetlb_difference" \ 45962306a36Sopenharmony_ci "Reserved memory charged to hugetlb cgroup." 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci expect_equal "$((5 * $MB * 1024 * 1024))" "$reserved_difference" \ 46262306a36Sopenharmony_ci "Reserved memory not charged to reservation usage." 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci echo 'PASS' 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci cleanup 46762306a36Sopenharmony_ci continue 46862306a36Sopenharmony_ci echo 46962306a36Sopenharmony_ci echo 47062306a36Sopenharmony_ci echo 47162306a36Sopenharmony_ci echo Test more than reservation case. 47262306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if [ "$reserve" != "-n" ]; then 47562306a36Sopenharmony_ci run_test "5" "$populate" '' "10" "2" "10" "$method" "$private" "1" \ 47662306a36Sopenharmony_ci "$reserve" 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci expect_equal "1" "$reservation_failed" "Reservation succeeded." 47962306a36Sopenharmony_ci fi 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci echo 'PASS' 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci cleanup 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci echo 48662306a36Sopenharmony_ci echo 48762306a36Sopenharmony_ci echo 48862306a36Sopenharmony_ci echo Test more than cgroup limit case. 48962306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci # Not sure if shm memory can be cleaned up when the process gets sigbus'd. 49262306a36Sopenharmony_ci if [[ "$method" != 2 ]]; then 49362306a36Sopenharmony_ci run_test 5 "$populate" "-w" 2 10 10 "$method" "$private" "1" "$reserve" 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci expect_equal "1" "$oom_killed" "Not oom killed." 49662306a36Sopenharmony_ci fi 49762306a36Sopenharmony_ci echo 'PASS' 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci cleanup 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci echo 50262306a36Sopenharmony_ci echo 50362306a36Sopenharmony_ci echo 50462306a36Sopenharmony_ci echo Test normal case, multiple cgroups. 50562306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 50662306a36Sopenharmony_ci run_multiple_cgroup_test "3" "$populate" "" "10" "10" "5" \ 50762306a36Sopenharmony_ci "$populate" "" "10" "10" "10" \ 50862306a36Sopenharmony_ci "$method" "$private" "0" "$reserve" 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci echo Memory charged to hugtlb1=$hugetlb_difference1 51162306a36Sopenharmony_ci echo Memory charged to reservation1=$reserved_difference1 51262306a36Sopenharmony_ci echo Memory charged to hugtlb2=$hugetlb_difference2 51362306a36Sopenharmony_ci echo Memory charged to reservation2=$reserved_difference2 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci if [[ "$reserve" != "-n" ]] || [[ "$populate" == "-o" ]]; then 51662306a36Sopenharmony_ci expect_equal "3" "$reserved_difference1" \ 51762306a36Sopenharmony_ci "Incorrect reservations charged to cgroup 1." 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci expect_equal "5" "$reserved_difference2" \ 52062306a36Sopenharmony_ci "Incorrect reservation charged to cgroup 2." 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci else 52362306a36Sopenharmony_ci expect_equal "0" "$reserved_difference1" \ 52462306a36Sopenharmony_ci "Incorrect reservations charged to cgroup 1." 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci expect_equal "0" "$reserved_difference2" \ 52762306a36Sopenharmony_ci "Incorrect reservation charged to cgroup 2." 52862306a36Sopenharmony_ci fi 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci if [[ "$populate" == "-o" ]]; then 53162306a36Sopenharmony_ci expect_equal "3" "$hugetlb_difference1" \ 53262306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 1." 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci expect_equal "5" "$hugetlb_difference2" \ 53562306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 2." 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci else 53862306a36Sopenharmony_ci expect_equal "0" "$hugetlb_difference1" \ 53962306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 1." 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci expect_equal "0" "$hugetlb_difference2" \ 54262306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 2." 54362306a36Sopenharmony_ci fi 54462306a36Sopenharmony_ci echo 'PASS' 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci cleanup 54762306a36Sopenharmony_ci echo 54862306a36Sopenharmony_ci echo 54962306a36Sopenharmony_ci echo 55062306a36Sopenharmony_ci echo Test normal case with write, multiple cgroups. 55162306a36Sopenharmony_ci echo private=$private, populate=$populate, method=$method, reserve=$reserve 55262306a36Sopenharmony_ci run_multiple_cgroup_test "3" "$populate" "-w" "10" "10" "5" \ 55362306a36Sopenharmony_ci "$populate" "-w" "10" "10" "10" \ 55462306a36Sopenharmony_ci "$method" "$private" "0" "$reserve" 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci echo Memory charged to hugtlb1=$hugetlb_difference1 55762306a36Sopenharmony_ci echo Memory charged to reservation1=$reserved_difference1 55862306a36Sopenharmony_ci echo Memory charged to hugtlb2=$hugetlb_difference2 55962306a36Sopenharmony_ci echo Memory charged to reservation2=$reserved_difference2 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci expect_equal "3" "$hugetlb_difference1" \ 56262306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 1." 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci expect_equal "3" "$reserved_difference1" \ 56562306a36Sopenharmony_ci "Incorrect reservation charged to cgroup 1." 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci expect_equal "5" "$hugetlb_difference2" \ 56862306a36Sopenharmony_ci "Incorrect hugetlb charged to cgroup 2." 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci expect_equal "5" "$reserved_difference2" \ 57162306a36Sopenharmony_ci "Incorrected reservation charged to cgroup 2." 57262306a36Sopenharmony_ci echo 'PASS' 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci cleanup 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci done # reserve 57762306a36Sopenharmony_ci done # private 57862306a36Sopenharmony_ci done # populate 57962306a36Sopenharmony_cidone # method 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ciif [[ $do_umount ]]; then 58262306a36Sopenharmony_ci umount $cgroup_path 58362306a36Sopenharmony_ci rmdir $cgroup_path 58462306a36Sopenharmony_cifi 585