71d2dc198fc178653ad105aa7884877618110f3d
[sfrench/cifs-2.6.git] / tools / testing / selftests / vm / run_vmtests.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #please run as root
4
5 # Kselftest framework requirement - SKIP code is 4.
6 ksft_skip=4
7
8 mnt=./huge
9 exitcode=0
10
11 #get huge pagesize and freepages from /proc/meminfo
12 while read name size unit; do
13         if [ "$name" = "HugePages_Free:" ]; then
14                 freepgs=$size
15         fi
16         if [ "$name" = "Hugepagesize:" ]; then
17                 hpgsize_KB=$size
18         fi
19 done < /proc/meminfo
20
21 # Simple hugetlbfs tests have a hardcoded minimum requirement of
22 # huge pages totaling 256MB (262144KB) in size.  The userfaultfd
23 # hugetlb test requires a minimum of 2 * nr_cpus huge pages.  Take
24 # both of these requirements into account and attempt to increase
25 # number of huge pages available.
26 nr_cpus=$(nproc)
27 hpgsize_MB=$((hpgsize_KB / 1024))
28 half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
29 needmem_KB=$((half_ufd_size_MB * 2 * 1024))
30
31 #set proper nr_hugepages
32 if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
33         nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
34         needpgs=$((needmem_KB / hpgsize_KB))
35         tries=2
36         while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do
37                 lackpgs=$(( $needpgs - $freepgs ))
38                 echo 3 > /proc/sys/vm/drop_caches
39                 echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
40                 if [ $? -ne 0 ]; then
41                         echo "Please run this test as root"
42                         exit $ksft_skip
43                 fi
44                 while read name size unit; do
45                         if [ "$name" = "HugePages_Free:" ]; then
46                                 freepgs=$size
47                         fi
48                 done < /proc/meminfo
49                 tries=$((tries - 1))
50         done
51         if [ $freepgs -lt $needpgs ]; then
52                 printf "Not enough huge pages available (%d < %d)\n" \
53                        $freepgs $needpgs
54                 exit 1
55         fi
56 else
57         echo "no hugetlbfs support in kernel?"
58         exit 1
59 fi
60
61 #filter 64bit architectures
62 ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
63 if [ -z $ARCH ]; then
64   ARCH=`uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/'`
65 fi
66 VADDR64=0
67 echo "$ARCH64STR" | grep $ARCH && VADDR64=1
68
69 mkdir $mnt
70 mount -t hugetlbfs none $mnt
71
72 echo "---------------------"
73 echo "running hugepage-mmap"
74 echo "---------------------"
75 ./hugepage-mmap
76 if [ $? -ne 0 ]; then
77         echo "[FAIL]"
78         exitcode=1
79 else
80         echo "[PASS]"
81 fi
82
83 shmmax=`cat /proc/sys/kernel/shmmax`
84 shmall=`cat /proc/sys/kernel/shmall`
85 echo 268435456 > /proc/sys/kernel/shmmax
86 echo 4194304 > /proc/sys/kernel/shmall
87 echo "--------------------"
88 echo "running hugepage-shm"
89 echo "--------------------"
90 ./hugepage-shm
91 if [ $? -ne 0 ]; then
92         echo "[FAIL]"
93         exitcode=1
94 else
95         echo "[PASS]"
96 fi
97 echo $shmmax > /proc/sys/kernel/shmmax
98 echo $shmall > /proc/sys/kernel/shmall
99
100 echo "-------------------"
101 echo "running map_hugetlb"
102 echo "-------------------"
103 ./map_hugetlb
104 if [ $? -ne 0 ]; then
105         echo "[FAIL]"
106         exitcode=1
107 else
108         echo "[PASS]"
109 fi
110
111 echo "-----------------------"
112 echo "running hugepage-mremap"
113 echo "-----------------------"
114 ./hugepage-mremap $mnt/huge_mremap
115 if [ $? -ne 0 ]; then
116         echo "[FAIL]"
117         exitcode=1
118 else
119         echo "[PASS]"
120 fi
121 rm -f $mnt/huge_mremap
122
123 echo "NOTE: The above hugetlb tests provide minimal coverage.  Use"
124 echo "      https://github.com/libhugetlbfs/libhugetlbfs.git for"
125 echo "      hugetlb regression testing."
126
127 echo "---------------------------"
128 echo "running map_fixed_noreplace"
129 echo "---------------------------"
130 ./map_fixed_noreplace
131 if [ $? -ne 0 ]; then
132         echo "[FAIL]"
133         exitcode=1
134 else
135         echo "[PASS]"
136 fi
137
138 echo "------------------------------------------------------"
139 echo "running: gup_test -u # get_user_pages_fast() benchmark"
140 echo "------------------------------------------------------"
141 ./gup_test -u
142 if [ $? -ne 0 ]; then
143         echo "[FAIL]"
144         exitcode=1
145 else
146         echo "[PASS]"
147 fi
148
149 echo "------------------------------------------------------"
150 echo "running: gup_test -a # pin_user_pages_fast() benchmark"
151 echo "------------------------------------------------------"
152 ./gup_test -a
153 if [ $? -ne 0 ]; then
154         echo "[FAIL]"
155         exitcode=1
156 else
157         echo "[PASS]"
158 fi
159
160 echo "------------------------------------------------------------"
161 echo "# Dump pages 0, 19, and 4096, using pin_user_pages:"
162 echo "running: gup_test -ct -F 0x1 0 19 0x1000 # dump_page() test"
163 echo "------------------------------------------------------------"
164 ./gup_test -ct -F 0x1 0 19 0x1000
165 if [ $? -ne 0 ]; then
166         echo "[FAIL]"
167         exitcode=1
168 else
169         echo "[PASS]"
170 fi
171
172 echo "-------------------"
173 echo "running userfaultfd"
174 echo "-------------------"
175 ./userfaultfd anon 20 16
176 if [ $? -ne 0 ]; then
177         echo "[FAIL]"
178         exitcode=1
179 else
180         echo "[PASS]"
181 fi
182
183 echo "---------------------------"
184 echo "running userfaultfd_hugetlb"
185 echo "---------------------------"
186 # Test requires source and destination huge pages.  Size of source
187 # (half_ufd_size_MB) is passed as argument to test.
188 ./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
189 if [ $? -ne 0 ]; then
190         echo "[FAIL]"
191         exitcode=1
192 else
193         echo "[PASS]"
194 fi
195 rm -f $mnt/ufd_test_file
196
197 echo "-------------------------"
198 echo "running userfaultfd_shmem"
199 echo "-------------------------"
200 ./userfaultfd shmem 20 16
201 if [ $? -ne 0 ]; then
202         echo "[FAIL]"
203         exitcode=1
204 else
205         echo "[PASS]"
206 fi
207
208 #cleanup
209 umount $mnt
210 rm -rf $mnt
211 echo $nr_hugepgs > /proc/sys/vm/nr_hugepages
212
213 echo "-----------------------"
214 echo "running compaction_test"
215 echo "-----------------------"
216 ./compaction_test
217 if [ $? -ne 0 ]; then
218         echo "[FAIL]"
219         exitcode=1
220 else
221         echo "[PASS]"
222 fi
223
224 echo "----------------------"
225 echo "running on-fault-limit"
226 echo "----------------------"
227 sudo -u nobody ./on-fault-limit
228 if [ $? -ne 0 ]; then
229         echo "[FAIL]"
230         exitcode=1
231 else
232         echo "[PASS]"
233 fi
234
235 echo "--------------------"
236 echo "running map_populate"
237 echo "--------------------"
238 ./map_populate
239 if [ $? -ne 0 ]; then
240         echo "[FAIL]"
241         exitcode=1
242 else
243         echo "[PASS]"
244 fi
245
246 echo "-------------------------"
247 echo "running mlock-random-test"
248 echo "-------------------------"
249 ./mlock-random-test
250 if [ $? -ne 0 ]; then
251         echo "[FAIL]"
252         exitcode=1
253 else
254         echo "[PASS]"
255 fi
256
257 echo "--------------------"
258 echo "running mlock2-tests"
259 echo "--------------------"
260 ./mlock2-tests
261 if [ $? -ne 0 ]; then
262         echo "[FAIL]"
263         exitcode=1
264 else
265         echo "[PASS]"
266 fi
267
268 echo "-------------------"
269 echo "running mremap_test"
270 echo "-------------------"
271 ./mremap_test
272 if [ $? -ne 0 ]; then
273         echo "[FAIL]"
274         exitcode=1
275 else
276         echo "[PASS]"
277 fi
278
279 echo "-----------------"
280 echo "running thuge-gen"
281 echo "-----------------"
282 ./thuge-gen
283 if [ $? -ne 0 ]; then
284         echo "[FAIL]"
285         exitcode=1
286 else
287         echo "[PASS]"
288 fi
289
290 if [ $VADDR64 -ne 0 ]; then
291 echo "-----------------------------"
292 echo "running virtual_address_range"
293 echo "-----------------------------"
294 ./virtual_address_range
295 if [ $? -ne 0 ]; then
296         echo "[FAIL]"
297         exitcode=1
298 else
299         echo "[PASS]"
300 fi
301
302 echo "-----------------------------"
303 echo "running virtual address 128TB switch test"
304 echo "-----------------------------"
305 ./va_128TBswitch
306 if [ $? -ne 0 ]; then
307     echo "[FAIL]"
308     exitcode=1
309 else
310     echo "[PASS]"
311 fi
312 fi # VADDR64
313
314 echo "------------------------------------"
315 echo "running vmalloc stability smoke test"
316 echo "------------------------------------"
317 ./test_vmalloc.sh smoke
318 ret_val=$?
319
320 if [ $ret_val -eq 0 ]; then
321         echo "[PASS]"
322 elif [ $ret_val -eq $ksft_skip ]; then
323          echo "[SKIP]"
324          exitcode=$ksft_skip
325 else
326         echo "[FAIL]"
327         exitcode=1
328 fi
329
330 echo "------------------------------------"
331 echo "running MREMAP_DONTUNMAP smoke test"
332 echo "------------------------------------"
333 ./mremap_dontunmap
334 ret_val=$?
335
336 if [ $ret_val -eq 0 ]; then
337         echo "[PASS]"
338 elif [ $ret_val -eq $ksft_skip ]; then
339          echo "[SKIP]"
340          exitcode=$ksft_skip
341 else
342         echo "[FAIL]"
343         exitcode=1
344 fi
345
346 echo "running HMM smoke test"
347 echo "------------------------------------"
348 ./test_hmm.sh smoke
349 ret_val=$?
350
351 if [ $ret_val -eq 0 ]; then
352         echo "[PASS]"
353 elif [ $ret_val -eq $ksft_skip ]; then
354         echo "[SKIP]"
355         exitcode=$ksft_skip
356 else
357         echo "[FAIL]"
358         exitcode=1
359 fi
360
361 echo "--------------------------------------------------------"
362 echo "running MADV_POPULATE_READ and MADV_POPULATE_WRITE tests"
363 echo "--------------------------------------------------------"
364 ./madv_populate
365 ret_val=$?
366
367 if [ $ret_val -eq 0 ]; then
368         echo "[PASS]"
369 elif [ $ret_val -eq $ksft_skip ]; then
370         echo "[SKIP]"
371         exitcode=$ksft_skip
372 else
373         echo "[FAIL]"
374         exitcode=1
375 fi
376
377 echo "running memfd_secret test"
378 echo "------------------------------------"
379 ./memfd_secret
380 ret_val=$?
381
382 if [ $ret_val -eq 0 ]; then
383         echo "[PASS]"
384 elif [ $ret_val -eq $ksft_skip ]; then
385         echo "[SKIP]"
386         exitcode=$ksft_skip
387 else
388         echo "[FAIL]"
389         exitcode=1
390 fi
391
392 echo "-------------------------------------------------------"
393 echo "running KSM MADV_MERGEABLE test with 10 identical pages"
394 echo "-------------------------------------------------------"
395 ./ksm_tests -M -p 10
396 ret_val=$?
397
398 if [ $ret_val -eq 0 ]; then
399         echo "[PASS]"
400 elif [ $ret_val -eq $ksft_skip ]; then
401          echo "[SKIP]"
402          exitcode=$ksft_skip
403 else
404         echo "[FAIL]"
405         exitcode=1
406 fi
407
408 echo "------------------------"
409 echo "running KSM unmerge test"
410 echo "------------------------"
411 ./ksm_tests -U
412 ret_val=$?
413
414 if [ $ret_val -eq 0 ]; then
415         echo "[PASS]"
416 elif [ $ret_val -eq $ksft_skip ]; then
417          echo "[SKIP]"
418          exitcode=$ksft_skip
419 else
420         echo "[FAIL]"
421         exitcode=1
422 fi
423
424 echo "----------------------------------------------------------"
425 echo "running KSM test with 10 zero pages and use_zero_pages = 0"
426 echo "----------------------------------------------------------"
427 ./ksm_tests -Z -p 10 -z 0
428 ret_val=$?
429
430 if [ $ret_val -eq 0 ]; then
431         echo "[PASS]"
432 elif [ $ret_val -eq $ksft_skip ]; then
433          echo "[SKIP]"
434          exitcode=$ksft_skip
435 else
436         echo "[FAIL]"
437         exitcode=1
438 fi
439
440 echo "----------------------------------------------------------"
441 echo "running KSM test with 10 zero pages and use_zero_pages = 1"
442 echo "----------------------------------------------------------"
443 ./ksm_tests -Z -p 10 -z 1
444 ret_val=$?
445
446 if [ $ret_val -eq 0 ]; then
447         echo "[PASS]"
448 elif [ $ret_val -eq $ksft_skip ]; then
449          echo "[SKIP]"
450          exitcode=$ksft_skip
451 else
452         echo "[FAIL]"
453         exitcode=1
454 fi
455
456 echo "-------------------------------------------------------------"
457 echo "running KSM test with 2 NUMA nodes and merge_across_nodes = 1"
458 echo "-------------------------------------------------------------"
459 ./ksm_tests -N -m 1
460 ret_val=$?
461
462 if [ $ret_val -eq 0 ]; then
463         echo "[PASS]"
464 elif [ $ret_val -eq $ksft_skip ]; then
465          echo "[SKIP]"
466          exitcode=$ksft_skip
467 else
468         echo "[FAIL]"
469         exitcode=1
470 fi
471
472 echo "-------------------------------------------------------------"
473 echo "running KSM test with 2 NUMA nodes and merge_across_nodes = 0"
474 echo "-------------------------------------------------------------"
475 ./ksm_tests -N -m 0
476 ret_val=$?
477
478 if [ $ret_val -eq 0 ]; then
479         echo "[PASS]"
480 elif [ $ret_val -eq $ksft_skip ]; then
481          echo "[SKIP]"
482          exitcode=$ksft_skip
483 else
484         echo "[FAIL]"
485         exitcode=1
486 fi
487
488 exit $exitcode
489
490 exit $exitcode