xref: /openbmc/linux/tools/testing/selftests/mm/charge_reserved_hugetlb.sh (revision fac59652993f075d57860769c99045b3ca18780d)
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