2 # SPDX-License-Identifier: GPL-2.0
5 # Kselftest framework requirement - SKIP code is 4.
15 usage: ${BASH_SOURCE[0]:-$0} [ -h | -t "<categories>"]
16 -t: specify specific categories to tests to run
17 -h: display this message
19 The default behavior is to run all tests.
21 Alternatively, specific groups tests can be run by passing a string
22 to the -t argument containing one or more of the following categories
29 tests for userfaultfd(2)
31 a test for the patch "Allow compaction of unevictable pages"
37 tests for very large virtual address space
43 test memadvise(2) MADV_POPULATE_{READ,WRITE} options
47 test process_mrelease(2)
49 ksm tests that do not require >=2 NUMA nodes
51 ksm tests that require >=2 NUMA nodes
53 memory protection key tests
55 test soft dirty page bit semantics
57 test copy-on-write semantics
58 example: ./run_vmtests.sh -t "hmm mmap ksm"
64 while getopts "ht:" OPT; do
67 "t") VM_SELFTEST_ITEMS=${OPTARG} ;;
72 # default behavior: run all tests
73 VM_SELFTEST_ITEMS=${VM_SELFTEST_ITEMS:-default}
76 if [ "$VM_SELFTEST_ITEMS" == "default" ]; then
77 # If no VM_SELFTEST_ITEMS are specified, run all tests
80 # If test selected argument is one of the test items
81 if [[ " ${VM_SELFTEST_ITEMS[*]} " =~ " ${1} " ]]; then
88 # get huge pagesize and freepages from /proc/meminfo
89 while read -r name size unit; do
90 if [ "$name" = "HugePages_Free:" ]; then
93 if [ "$name" = "Hugepagesize:" ]; then
98 # Simple hugetlbfs tests have a hardcoded minimum requirement of
99 # huge pages totaling 256MB (262144KB) in size. The userfaultfd
100 # hugetlb test requires a minimum of 2 * nr_cpus huge pages. Take
101 # both of these requirements into account and attempt to increase
102 # number of huge pages available.
104 hpgsize_MB=$((hpgsize_KB / 1024))
105 half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
106 needmem_KB=$((half_ufd_size_MB * 2 * 1024))
108 # set proper nr_hugepages
109 if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
110 nr_hugepgs=$(cat /proc/sys/vm/nr_hugepages)
111 needpgs=$((needmem_KB / hpgsize_KB))
113 while [ "$tries" -gt 0 ] && [ "$freepgs" -lt "$needpgs" ]; do
114 lackpgs=$((needpgs - freepgs))
115 echo 3 > /proc/sys/vm/drop_caches
116 if ! echo $((lackpgs + nr_hugepgs)) > /proc/sys/vm/nr_hugepages; then
117 echo "Please run this test as root"
120 while read -r name size unit; do
121 if [ "$name" = "HugePages_Free:" ]; then
127 if [ "$freepgs" -lt "$needpgs" ]; then
128 printf "Not enough huge pages available (%d < %d)\n" \
129 "$freepgs" "$needpgs"
133 echo "no hugetlbfs support in kernel?"
137 # filter 64bit architectures
138 ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sparc64 x86_64"
139 if [ -z "$ARCH" ]; then
140 ARCH=$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/')
143 echo "$ARCH64STR" | grep "$ARCH" &>/dev/null && VADDR64=1
145 # Usage: run_test [test binary] [arbitrary test arguments...]
147 if test_selected ${CATEGORY}; then
148 local title="running $*"
149 local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
150 printf "%s\n%s\n%s\n" "$sep" "$title" "$sep"
154 if [ $ret -eq 0 ]; then
155 count_pass=$(( count_pass + 1 ))
157 elif [ $ret -eq $ksft_skip ]; then
158 count_skip=$(( count_skip + 1 ))
162 count_fail=$(( count_fail + 1 ))
169 CATEGORY="hugetlb" run_test ./hugepage-mmap
171 shmmax=$(cat /proc/sys/kernel/shmmax)
172 shmall=$(cat /proc/sys/kernel/shmall)
173 echo 268435456 > /proc/sys/kernel/shmmax
174 echo 4194304 > /proc/sys/kernel/shmall
175 CATEGORY="hugetlb" run_test ./hugepage-shm
176 echo "$shmmax" > /proc/sys/kernel/shmmax
177 echo "$shmall" > /proc/sys/kernel/shmall
179 CATEGORY="hugetlb" run_test ./map_hugetlb
180 CATEGORY="hugetlb" run_test ./hugepage-mremap
181 CATEGORY="hugetlb" run_test ./hugepage-vmemmap
182 CATEGORY="hugetlb" run_test ./hugetlb-madvise
184 if test_selected "hugetlb"; then
185 echo "NOTE: These hugetlb tests provide minimal coverage. Use"
186 echo " https://github.com/libhugetlbfs/libhugetlbfs.git for"
187 echo " hugetlb regression testing."
190 CATEGORY="mmap" run_test ./map_fixed_noreplace
192 # get_user_pages_fast() benchmark
193 CATEGORY="gup_test" run_test ./gup_test -u
194 # pin_user_pages_fast() benchmark
195 CATEGORY="gup_test" run_test ./gup_test -a
196 # Dump pages 0, 19, and 4096, using pin_user_pages:
197 CATEGORY="gup_test" run_test ./gup_test -ct -F 0x1 0 19 0x1000
199 CATEGORY="gup_test" run_test ./gup_longterm
201 CATEGORY="userfaultfd" run_test ./uffd-unit-tests
202 uffd_stress_bin=./uffd-stress
203 CATEGORY="userfaultfd" run_test ${uffd_stress_bin} anon 20 16
204 # Hugetlb tests require source and destination huge pages. Pass in half
205 # the size ($half_ufd_size_MB), which is used for *each*.
206 CATEGORY="userfaultfd" run_test ${uffd_stress_bin} hugetlb "$half_ufd_size_MB" 32
207 CATEGORY="userfaultfd" run_test ${uffd_stress_bin} hugetlb-private "$half_ufd_size_MB" 32
208 CATEGORY="userfaultfd" run_test ${uffd_stress_bin} shmem 20 16
209 CATEGORY="userfaultfd" run_test ${uffd_stress_bin} shmem-private 20 16
212 echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages
214 CATEGORY="compaction" run_test ./compaction_test
216 CATEGORY="mlock" run_test sudo -u nobody ./on-fault-limit
218 CATEGORY="mmap" run_test ./map_populate
220 CATEGORY="mlock" run_test ./mlock-random-test
222 CATEGORY="mlock" run_test ./mlock2-tests
224 CATEGORY="process_mrelease" run_test ./mrelease_test
226 CATEGORY="mremap" run_test ./mremap_test
228 CATEGORY="hugetlb" run_test ./thuge-gen
230 if [ $VADDR64 -ne 0 ]; then
232 # set overcommit_policy as OVERCOMMIT_ALWAYS so that kernel
233 # allows high virtual address allocation requests independent
234 # of platform's physical memory.
236 prev_policy=$(cat /proc/sys/vm/overcommit_memory)
237 echo 1 > /proc/sys/vm/overcommit_memory
238 CATEGORY="hugevm" run_test ./virtual_address_range
239 echo $prev_policy > /proc/sys/vm/overcommit_memory
241 # va high address boundary switch test
243 prev_nr_hugepages=$(cat /proc/sys/vm/nr_hugepages)
244 if [ "$ARCH" == "$ARCH_ARM64" ]; then
245 echo 6 > /proc/sys/vm/nr_hugepages
247 CATEGORY="hugevm" run_test bash ./va_high_addr_switch.sh
248 if [ "$ARCH" == "$ARCH_ARM64" ]; then
249 echo $prev_nr_hugepages > /proc/sys/vm/nr_hugepages
253 # vmalloc stability smoke test
254 CATEGORY="vmalloc" run_test bash ./test_vmalloc.sh smoke
256 CATEGORY="mremap" run_test ./mremap_dontunmap
258 CATEGORY="hmm" run_test bash ./test_hmm.sh smoke
260 # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests
261 CATEGORY="madv_populate" run_test ./madv_populate
263 CATEGORY="memfd_secret" run_test ./memfd_secret
265 # KSM MADV_MERGEABLE test with 10 identical pages
266 CATEGORY="ksm" run_test ./ksm_tests -M -p 10
268 CATEGORY="ksm" run_test ./ksm_tests -U
269 # KSM test with 10 zero pages and use_zero_pages = 0
270 CATEGORY="ksm" run_test ./ksm_tests -Z -p 10 -z 0
271 # KSM test with 10 zero pages and use_zero_pages = 1
272 CATEGORY="ksm" run_test ./ksm_tests -Z -p 10 -z 1
273 # KSM test with 2 NUMA nodes and merge_across_nodes = 1
274 CATEGORY="ksm_numa" run_test ./ksm_tests -N -m 1
275 # KSM test with 2 NUMA nodes and merge_across_nodes = 0
276 CATEGORY="ksm_numa" run_test ./ksm_tests -N -m 0
278 CATEGORY="ksm" run_test ./ksm_functional_tests
280 run_test ./ksm_functional_tests
282 # protection_keys tests
283 if [ -x ./protection_keys_32 ]
285 CATEGORY="pkey" run_test ./protection_keys_32
288 if [ -x ./protection_keys_64 ]
290 CATEGORY="pkey" run_test ./protection_keys_64
293 CATEGORY="soft_dirty" run_test ./soft-dirty
296 CATEGORY="cow" run_test ./cow
298 echo "SUMMARY: PASS=${count_pass} SKIP=${count_skip} FAIL=${count_fail}"