xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/vm/run_vmtests (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun#please run as root
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
6*4882a593Smuzhiyunksft_skip=4
7*4882a593Smuzhiyun
8*4882a593Smuzhiyunmnt=./huge
9*4882a593Smuzhiyunexitcode=0
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun#get huge pagesize and freepages from /proc/meminfo
12*4882a593Smuzhiyunwhile read name size unit; do
13*4882a593Smuzhiyun	if [ "$name" = "HugePages_Free:" ]; then
14*4882a593Smuzhiyun		freepgs=$size
15*4882a593Smuzhiyun	fi
16*4882a593Smuzhiyun	if [ "$name" = "Hugepagesize:" ]; then
17*4882a593Smuzhiyun		hpgsize_KB=$size
18*4882a593Smuzhiyun	fi
19*4882a593Smuzhiyundone < /proc/meminfo
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun# Simple hugetlbfs tests have a hardcoded minimum requirement of
22*4882a593Smuzhiyun# huge pages totaling 256MB (262144KB) in size.  The userfaultfd
23*4882a593Smuzhiyun# hugetlb test requires a minimum of 2 * nr_cpus huge pages.  Take
24*4882a593Smuzhiyun# both of these requirements into account and attempt to increase
25*4882a593Smuzhiyun# number of huge pages available.
26*4882a593Smuzhiyunnr_cpus=$(nproc)
27*4882a593Smuzhiyunhpgsize_MB=$((hpgsize_KB / 1024))
28*4882a593Smuzhiyunhalf_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
29*4882a593Smuzhiyunneedmem_KB=$((half_ufd_size_MB * 2 * 1024))
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun#set proper nr_hugepages
32*4882a593Smuzhiyunif [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
33*4882a593Smuzhiyun	nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
34*4882a593Smuzhiyun	needpgs=$((needmem_KB / hpgsize_KB))
35*4882a593Smuzhiyun	tries=2
36*4882a593Smuzhiyun	while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do
37*4882a593Smuzhiyun		lackpgs=$(( $needpgs - $freepgs ))
38*4882a593Smuzhiyun		echo 3 > /proc/sys/vm/drop_caches
39*4882a593Smuzhiyun		echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
40*4882a593Smuzhiyun		if [ $? -ne 0 ]; then
41*4882a593Smuzhiyun			echo "Please run this test as root"
42*4882a593Smuzhiyun			exit $ksft_skip
43*4882a593Smuzhiyun		fi
44*4882a593Smuzhiyun		while read name size unit; do
45*4882a593Smuzhiyun			if [ "$name" = "HugePages_Free:" ]; then
46*4882a593Smuzhiyun				freepgs=$size
47*4882a593Smuzhiyun			fi
48*4882a593Smuzhiyun		done < /proc/meminfo
49*4882a593Smuzhiyun		tries=$((tries - 1))
50*4882a593Smuzhiyun	done
51*4882a593Smuzhiyun	if [ $freepgs -lt $needpgs ]; then
52*4882a593Smuzhiyun		printf "Not enough huge pages available (%d < %d)\n" \
53*4882a593Smuzhiyun		       $freepgs $needpgs
54*4882a593Smuzhiyun		exit 1
55*4882a593Smuzhiyun	fi
56*4882a593Smuzhiyunelse
57*4882a593Smuzhiyun	echo "no hugetlbfs support in kernel?"
58*4882a593Smuzhiyun	exit 1
59*4882a593Smuzhiyunfi
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun#filter 64bit architectures
62*4882a593SmuzhiyunARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
63*4882a593Smuzhiyunif [ -z $ARCH ]; then
64*4882a593Smuzhiyun  ARCH=`uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/'`
65*4882a593Smuzhiyunfi
66*4882a593SmuzhiyunVADDR64=0
67*4882a593Smuzhiyunecho "$ARCH64STR" | grep $ARCH && VADDR64=1
68*4882a593Smuzhiyun
69*4882a593Smuzhiyunmkdir $mnt
70*4882a593Smuzhiyunmount -t hugetlbfs none $mnt
71*4882a593Smuzhiyun
72*4882a593Smuzhiyunecho "---------------------"
73*4882a593Smuzhiyunecho "running hugepage-mmap"
74*4882a593Smuzhiyunecho "---------------------"
75*4882a593Smuzhiyun./hugepage-mmap
76*4882a593Smuzhiyunif [ $? -ne 0 ]; then
77*4882a593Smuzhiyun	echo "[FAIL]"
78*4882a593Smuzhiyun	exitcode=1
79*4882a593Smuzhiyunelse
80*4882a593Smuzhiyun	echo "[PASS]"
81*4882a593Smuzhiyunfi
82*4882a593Smuzhiyun
83*4882a593Smuzhiyunshmmax=`cat /proc/sys/kernel/shmmax`
84*4882a593Smuzhiyunshmall=`cat /proc/sys/kernel/shmall`
85*4882a593Smuzhiyunecho 268435456 > /proc/sys/kernel/shmmax
86*4882a593Smuzhiyunecho 4194304 > /proc/sys/kernel/shmall
87*4882a593Smuzhiyunecho "--------------------"
88*4882a593Smuzhiyunecho "running hugepage-shm"
89*4882a593Smuzhiyunecho "--------------------"
90*4882a593Smuzhiyun./hugepage-shm
91*4882a593Smuzhiyunif [ $? -ne 0 ]; then
92*4882a593Smuzhiyun	echo "[FAIL]"
93*4882a593Smuzhiyun	exitcode=1
94*4882a593Smuzhiyunelse
95*4882a593Smuzhiyun	echo "[PASS]"
96*4882a593Smuzhiyunfi
97*4882a593Smuzhiyunecho $shmmax > /proc/sys/kernel/shmmax
98*4882a593Smuzhiyunecho $shmall > /proc/sys/kernel/shmall
99*4882a593Smuzhiyun
100*4882a593Smuzhiyunecho "-------------------"
101*4882a593Smuzhiyunecho "running map_hugetlb"
102*4882a593Smuzhiyunecho "-------------------"
103*4882a593Smuzhiyun./map_hugetlb
104*4882a593Smuzhiyunif [ $? -ne 0 ]; then
105*4882a593Smuzhiyun	echo "[FAIL]"
106*4882a593Smuzhiyun	exitcode=1
107*4882a593Smuzhiyunelse
108*4882a593Smuzhiyun	echo "[PASS]"
109*4882a593Smuzhiyunfi
110*4882a593Smuzhiyun
111*4882a593Smuzhiyunecho "NOTE: The above hugetlb tests provide minimal coverage.  Use"
112*4882a593Smuzhiyunecho "      https://github.com/libhugetlbfs/libhugetlbfs.git for"
113*4882a593Smuzhiyunecho "      hugetlb regression testing."
114*4882a593Smuzhiyun
115*4882a593Smuzhiyunecho "---------------------------"
116*4882a593Smuzhiyunecho "running map_fixed_noreplace"
117*4882a593Smuzhiyunecho "---------------------------"
118*4882a593Smuzhiyun./map_fixed_noreplace
119*4882a593Smuzhiyunif [ $? -ne 0 ]; then
120*4882a593Smuzhiyun	echo "[FAIL]"
121*4882a593Smuzhiyun	exitcode=1
122*4882a593Smuzhiyunelse
123*4882a593Smuzhiyun	echo "[PASS]"
124*4882a593Smuzhiyunfi
125*4882a593Smuzhiyun
126*4882a593Smuzhiyunecho "--------------------------------------------"
127*4882a593Smuzhiyunecho "running 'gup_benchmark -U' (normal/slow gup)"
128*4882a593Smuzhiyunecho "--------------------------------------------"
129*4882a593Smuzhiyun./gup_benchmark -U
130*4882a593Smuzhiyunif [ $? -ne 0 ]; then
131*4882a593Smuzhiyun	echo "[FAIL]"
132*4882a593Smuzhiyun	exitcode=1
133*4882a593Smuzhiyunelse
134*4882a593Smuzhiyun	echo "[PASS]"
135*4882a593Smuzhiyunfi
136*4882a593Smuzhiyun
137*4882a593Smuzhiyunecho "------------------------------------------"
138*4882a593Smuzhiyunecho "running gup_benchmark -b (pin_user_pages)"
139*4882a593Smuzhiyunecho "------------------------------------------"
140*4882a593Smuzhiyun./gup_benchmark -b
141*4882a593Smuzhiyunif [ $? -ne 0 ]; then
142*4882a593Smuzhiyun	echo "[FAIL]"
143*4882a593Smuzhiyun	exitcode=1
144*4882a593Smuzhiyunelse
145*4882a593Smuzhiyun	echo "[PASS]"
146*4882a593Smuzhiyunfi
147*4882a593Smuzhiyun
148*4882a593Smuzhiyunecho "-------------------"
149*4882a593Smuzhiyunecho "running userfaultfd"
150*4882a593Smuzhiyunecho "-------------------"
151*4882a593Smuzhiyun./userfaultfd anon 128 32
152*4882a593Smuzhiyunif [ $? -ne 0 ]; then
153*4882a593Smuzhiyun	echo "[FAIL]"
154*4882a593Smuzhiyun	exitcode=1
155*4882a593Smuzhiyunelse
156*4882a593Smuzhiyun	echo "[PASS]"
157*4882a593Smuzhiyunfi
158*4882a593Smuzhiyun
159*4882a593Smuzhiyunecho "---------------------------"
160*4882a593Smuzhiyunecho "running userfaultfd_hugetlb"
161*4882a593Smuzhiyunecho "---------------------------"
162*4882a593Smuzhiyun# Test requires source and destination huge pages.  Size of source
163*4882a593Smuzhiyun# (half_ufd_size_MB) is passed as argument to test.
164*4882a593Smuzhiyun./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
165*4882a593Smuzhiyunif [ $? -ne 0 ]; then
166*4882a593Smuzhiyun	echo "[FAIL]"
167*4882a593Smuzhiyun	exitcode=1
168*4882a593Smuzhiyunelse
169*4882a593Smuzhiyun	echo "[PASS]"
170*4882a593Smuzhiyunfi
171*4882a593Smuzhiyunrm -f $mnt/ufd_test_file
172*4882a593Smuzhiyun
173*4882a593Smuzhiyunecho "-------------------------"
174*4882a593Smuzhiyunecho "running userfaultfd_shmem"
175*4882a593Smuzhiyunecho "-------------------------"
176*4882a593Smuzhiyun./userfaultfd shmem 128 32
177*4882a593Smuzhiyunif [ $? -ne 0 ]; then
178*4882a593Smuzhiyun	echo "[FAIL]"
179*4882a593Smuzhiyun	exitcode=1
180*4882a593Smuzhiyunelse
181*4882a593Smuzhiyun	echo "[PASS]"
182*4882a593Smuzhiyunfi
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun#cleanup
185*4882a593Smuzhiyunumount $mnt
186*4882a593Smuzhiyunrm -rf $mnt
187*4882a593Smuzhiyunecho $nr_hugepgs > /proc/sys/vm/nr_hugepages
188*4882a593Smuzhiyun
189*4882a593Smuzhiyunecho "-----------------------"
190*4882a593Smuzhiyunecho "running compaction_test"
191*4882a593Smuzhiyunecho "-----------------------"
192*4882a593Smuzhiyun./compaction_test
193*4882a593Smuzhiyunif [ $? -ne 0 ]; then
194*4882a593Smuzhiyun	echo "[FAIL]"
195*4882a593Smuzhiyun	exitcode=1
196*4882a593Smuzhiyunelse
197*4882a593Smuzhiyun	echo "[PASS]"
198*4882a593Smuzhiyunfi
199*4882a593Smuzhiyun
200*4882a593Smuzhiyunecho "----------------------"
201*4882a593Smuzhiyunecho "running on-fault-limit"
202*4882a593Smuzhiyunecho "----------------------"
203*4882a593Smuzhiyunsudo -u nobody ./on-fault-limit
204*4882a593Smuzhiyunif [ $? -ne 0 ]; then
205*4882a593Smuzhiyun	echo "[FAIL]"
206*4882a593Smuzhiyun	exitcode=1
207*4882a593Smuzhiyunelse
208*4882a593Smuzhiyun	echo "[PASS]"
209*4882a593Smuzhiyunfi
210*4882a593Smuzhiyun
211*4882a593Smuzhiyunecho "--------------------"
212*4882a593Smuzhiyunecho "running map_populate"
213*4882a593Smuzhiyunecho "--------------------"
214*4882a593Smuzhiyun./map_populate
215*4882a593Smuzhiyunif [ $? -ne 0 ]; then
216*4882a593Smuzhiyun	echo "[FAIL]"
217*4882a593Smuzhiyun	exitcode=1
218*4882a593Smuzhiyunelse
219*4882a593Smuzhiyun	echo "[PASS]"
220*4882a593Smuzhiyunfi
221*4882a593Smuzhiyun
222*4882a593Smuzhiyunecho "-------------------------"
223*4882a593Smuzhiyunecho "running mlock-random-test"
224*4882a593Smuzhiyunecho "-------------------------"
225*4882a593Smuzhiyun./mlock-random-test
226*4882a593Smuzhiyunif [ $? -ne 0 ]; then
227*4882a593Smuzhiyun	echo "[FAIL]"
228*4882a593Smuzhiyun	exitcode=1
229*4882a593Smuzhiyunelse
230*4882a593Smuzhiyun	echo "[PASS]"
231*4882a593Smuzhiyunfi
232*4882a593Smuzhiyun
233*4882a593Smuzhiyunecho "--------------------"
234*4882a593Smuzhiyunecho "running mlock2-tests"
235*4882a593Smuzhiyunecho "--------------------"
236*4882a593Smuzhiyun./mlock2-tests
237*4882a593Smuzhiyunif [ $? -ne 0 ]; then
238*4882a593Smuzhiyun	echo "[FAIL]"
239*4882a593Smuzhiyun	exitcode=1
240*4882a593Smuzhiyunelse
241*4882a593Smuzhiyun	echo "[PASS]"
242*4882a593Smuzhiyunfi
243*4882a593Smuzhiyun
244*4882a593Smuzhiyunecho "-----------------"
245*4882a593Smuzhiyunecho "running thuge-gen"
246*4882a593Smuzhiyunecho "-----------------"
247*4882a593Smuzhiyun./thuge-gen
248*4882a593Smuzhiyunif [ $? -ne 0 ]; then
249*4882a593Smuzhiyun	echo "[FAIL]"
250*4882a593Smuzhiyun	exitcode=1
251*4882a593Smuzhiyunelse
252*4882a593Smuzhiyun	echo "[PASS]"
253*4882a593Smuzhiyunfi
254*4882a593Smuzhiyun
255*4882a593Smuzhiyunif [ $VADDR64 -ne 0 ]; then
256*4882a593Smuzhiyunecho "-----------------------------"
257*4882a593Smuzhiyunecho "running virtual_address_range"
258*4882a593Smuzhiyunecho "-----------------------------"
259*4882a593Smuzhiyun./virtual_address_range
260*4882a593Smuzhiyunif [ $? -ne 0 ]; then
261*4882a593Smuzhiyun	echo "[FAIL]"
262*4882a593Smuzhiyun	exitcode=1
263*4882a593Smuzhiyunelse
264*4882a593Smuzhiyun	echo "[PASS]"
265*4882a593Smuzhiyunfi
266*4882a593Smuzhiyun
267*4882a593Smuzhiyunecho "-----------------------------"
268*4882a593Smuzhiyunecho "running virtual address 128TB switch test"
269*4882a593Smuzhiyunecho "-----------------------------"
270*4882a593Smuzhiyun./va_128TBswitch
271*4882a593Smuzhiyunif [ $? -ne 0 ]; then
272*4882a593Smuzhiyun    echo "[FAIL]"
273*4882a593Smuzhiyun    exitcode=1
274*4882a593Smuzhiyunelse
275*4882a593Smuzhiyun    echo "[PASS]"
276*4882a593Smuzhiyunfi
277*4882a593Smuzhiyunfi # VADDR64
278*4882a593Smuzhiyun
279*4882a593Smuzhiyunecho "------------------------------------"
280*4882a593Smuzhiyunecho "running vmalloc stability smoke test"
281*4882a593Smuzhiyunecho "------------------------------------"
282*4882a593Smuzhiyun./test_vmalloc.sh smoke
283*4882a593Smuzhiyunret_val=$?
284*4882a593Smuzhiyun
285*4882a593Smuzhiyunif [ $ret_val -eq 0 ]; then
286*4882a593Smuzhiyun	echo "[PASS]"
287*4882a593Smuzhiyunelif [ $ret_val -eq $ksft_skip ]; then
288*4882a593Smuzhiyun	 echo "[SKIP]"
289*4882a593Smuzhiyun	 exitcode=$ksft_skip
290*4882a593Smuzhiyunelse
291*4882a593Smuzhiyun	echo "[FAIL]"
292*4882a593Smuzhiyun	exitcode=1
293*4882a593Smuzhiyunfi
294*4882a593Smuzhiyun
295*4882a593Smuzhiyunecho "------------------------------------"
296*4882a593Smuzhiyunecho "running MREMAP_DONTUNMAP smoke test"
297*4882a593Smuzhiyunecho "------------------------------------"
298*4882a593Smuzhiyun./mremap_dontunmap
299*4882a593Smuzhiyunret_val=$?
300*4882a593Smuzhiyun
301*4882a593Smuzhiyunif [ $ret_val -eq 0 ]; then
302*4882a593Smuzhiyun	echo "[PASS]"
303*4882a593Smuzhiyunelif [ $ret_val -eq $ksft_skip ]; then
304*4882a593Smuzhiyun	 echo "[SKIP]"
305*4882a593Smuzhiyun	 exitcode=$ksft_skip
306*4882a593Smuzhiyunelse
307*4882a593Smuzhiyun	echo "[FAIL]"
308*4882a593Smuzhiyun	exitcode=1
309*4882a593Smuzhiyunfi
310*4882a593Smuzhiyun
311*4882a593Smuzhiyunecho "running HMM smoke test"
312*4882a593Smuzhiyunecho "------------------------------------"
313*4882a593Smuzhiyun./test_hmm.sh smoke
314*4882a593Smuzhiyunret_val=$?
315*4882a593Smuzhiyun
316*4882a593Smuzhiyunif [ $ret_val -eq 0 ]; then
317*4882a593Smuzhiyun	echo "[PASS]"
318*4882a593Smuzhiyunelif [ $ret_val -eq $ksft_skip ]; then
319*4882a593Smuzhiyun	echo "[SKIP]"
320*4882a593Smuzhiyun	exitcode=$ksft_skip
321*4882a593Smuzhiyunelse
322*4882a593Smuzhiyun	echo "[FAIL]"
323*4882a593Smuzhiyun	exitcode=1
324*4882a593Smuzhiyunfi
325*4882a593Smuzhiyun
326*4882a593Smuzhiyunexit $exitcode
327