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