kselftests: vm: add mremap tests
[linux-2.6-microblaze.git] / tools / testing / selftests / vm / run_vmtests
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 "NOTE: The above hugetlb tests provide minimal coverage.  Use"
112 echo "      https://github.com/libhugetlbfs/libhugetlbfs.git for"
113 echo "      hugetlb regression testing."
114
115 echo "---------------------------"
116 echo "running map_fixed_noreplace"
117 echo "---------------------------"
118 ./map_fixed_noreplace
119 if [ $? -ne 0 ]; then
120         echo "[FAIL]"
121         exitcode=1
122 else
123         echo "[PASS]"
124 fi
125
126 echo "------------------------------------------------------"
127 echo "running: gup_test -u # get_user_pages_fast() benchmark"
128 echo "------------------------------------------------------"
129 ./gup_test -u
130 if [ $? -ne 0 ]; then
131         echo "[FAIL]"
132         exitcode=1
133 else
134         echo "[PASS]"
135 fi
136
137 echo "------------------------------------------------------"
138 echo "running: gup_test -a # pin_user_pages_fast() benchmark"
139 echo "------------------------------------------------------"
140 ./gup_test -a
141 if [ $? -ne 0 ]; then
142         echo "[FAIL]"
143         exitcode=1
144 else
145         echo "[PASS]"
146 fi
147
148 echo "------------------------------------------------------------"
149 echo "# Dump pages 0, 19, and 4096, using pin_user_pages:"
150 echo "running: gup_test -ct -F 0x1 0 19 0x1000 # dump_page() test"
151 echo "------------------------------------------------------------"
152 ./gup_test -ct -F 0x1 0 19 0x1000
153 if [ $? -ne 0 ]; then
154         echo "[FAIL]"
155         exitcode=1
156 else
157         echo "[PASS]"
158 fi
159
160 echo "-------------------"
161 echo "running userfaultfd"
162 echo "-------------------"
163 ./userfaultfd anon 20 16
164 if [ $? -ne 0 ]; then
165         echo "[FAIL]"
166         exitcode=1
167 else
168         echo "[PASS]"
169 fi
170
171 echo "---------------------------"
172 echo "running userfaultfd_hugetlb"
173 echo "---------------------------"
174 # Test requires source and destination huge pages.  Size of source
175 # (half_ufd_size_MB) is passed as argument to test.
176 ./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
177 if [ $? -ne 0 ]; then
178         echo "[FAIL]"
179         exitcode=1
180 else
181         echo "[PASS]"
182 fi
183 rm -f $mnt/ufd_test_file
184
185 echo "-------------------------"
186 echo "running userfaultfd_shmem"
187 echo "-------------------------"
188 ./userfaultfd shmem 20 16
189 if [ $? -ne 0 ]; then
190         echo "[FAIL]"
191         exitcode=1
192 else
193         echo "[PASS]"
194 fi
195
196 #cleanup
197 umount $mnt
198 rm -rf $mnt
199 echo $nr_hugepgs > /proc/sys/vm/nr_hugepages
200
201 echo "-----------------------"
202 echo "running compaction_test"
203 echo "-----------------------"
204 ./compaction_test
205 if [ $? -ne 0 ]; then
206         echo "[FAIL]"
207         exitcode=1
208 else
209         echo "[PASS]"
210 fi
211
212 echo "----------------------"
213 echo "running on-fault-limit"
214 echo "----------------------"
215 sudo -u nobody ./on-fault-limit
216 if [ $? -ne 0 ]; then
217         echo "[FAIL]"
218         exitcode=1
219 else
220         echo "[PASS]"
221 fi
222
223 echo "--------------------"
224 echo "running map_populate"
225 echo "--------------------"
226 ./map_populate
227 if [ $? -ne 0 ]; then
228         echo "[FAIL]"
229         exitcode=1
230 else
231         echo "[PASS]"
232 fi
233
234 echo "-------------------------"
235 echo "running mlock-random-test"
236 echo "-------------------------"
237 ./mlock-random-test
238 if [ $? -ne 0 ]; then
239         echo "[FAIL]"
240         exitcode=1
241 else
242         echo "[PASS]"
243 fi
244
245 echo "--------------------"
246 echo "running mlock2-tests"
247 echo "--------------------"
248 ./mlock2-tests
249 if [ $? -ne 0 ]; then
250         echo "[FAIL]"
251         exitcode=1
252 else
253         echo "[PASS]"
254 fi
255
256 echo "-------------------"
257 echo "running mremap_test"
258 echo "-------------------"
259 ./mremap_test
260 if [ $? -ne 0 ]; then
261         echo "[FAIL]"
262         exitcode=1
263 else
264         echo "[PASS]"
265 fi
266
267 echo "-----------------"
268 echo "running thuge-gen"
269 echo "-----------------"
270 ./thuge-gen
271 if [ $? -ne 0 ]; then
272         echo "[FAIL]"
273         exitcode=1
274 else
275         echo "[PASS]"
276 fi
277
278 if [ $VADDR64 -ne 0 ]; then
279 echo "-----------------------------"
280 echo "running virtual_address_range"
281 echo "-----------------------------"
282 ./virtual_address_range
283 if [ $? -ne 0 ]; then
284         echo "[FAIL]"
285         exitcode=1
286 else
287         echo "[PASS]"
288 fi
289
290 echo "-----------------------------"
291 echo "running virtual address 128TB switch test"
292 echo "-----------------------------"
293 ./va_128TBswitch
294 if [ $? -ne 0 ]; then
295     echo "[FAIL]"
296     exitcode=1
297 else
298     echo "[PASS]"
299 fi
300 fi # VADDR64
301
302 echo "------------------------------------"
303 echo "running vmalloc stability smoke test"
304 echo "------------------------------------"
305 ./test_vmalloc.sh smoke
306 ret_val=$?
307
308 if [ $ret_val -eq 0 ]; then
309         echo "[PASS]"
310 elif [ $ret_val -eq $ksft_skip ]; then
311          echo "[SKIP]"
312          exitcode=$ksft_skip
313 else
314         echo "[FAIL]"
315         exitcode=1
316 fi
317
318 echo "------------------------------------"
319 echo "running MREMAP_DONTUNMAP smoke test"
320 echo "------------------------------------"
321 ./mremap_dontunmap
322 ret_val=$?
323
324 if [ $ret_val -eq 0 ]; then
325         echo "[PASS]"
326 elif [ $ret_val -eq $ksft_skip ]; then
327          echo "[SKIP]"
328          exitcode=$ksft_skip
329 else
330         echo "[FAIL]"
331         exitcode=1
332 fi
333
334 echo "running HMM smoke test"
335 echo "------------------------------------"
336 ./test_hmm.sh smoke
337 ret_val=$?
338
339 if [ $ret_val -eq 0 ]; then
340         echo "[PASS]"
341 elif [ $ret_val -eq $ksft_skip ]; then
342         echo "[SKIP]"
343         exitcode=$ksft_skip
344 else
345         echo "[FAIL]"
346         exitcode=1
347 fi
348
349 exit $exitcode