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