Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3# Please run as root
  4
  5# Kselftest framework requirement - SKIP code is 4.
  6ksft_skip=4
  7
  8exitcode=0
  9
 10usage() {
 11	cat <<EOF
 12usage: ${BASH_SOURCE[0]:-$0} [ -h | -t "<categories>"]
 13  -t: specify specific categories to tests to run
 14  -h: display this message
 15
 16The default behavior is to run all tests.
 17
 18Alternatively, specific groups tests can be run by passing a string
 19to the -t argument containing one or more of the following categories
 20separated by spaces:
 21- mmap
 22	tests for mmap(2)
 23- gup_test
 24	tests for gup using gup_test interface
 25- userfaultfd
 26	tests for  userfaultfd(2)
 27- compaction
 28	a test for the patch "Allow compaction of unevictable pages"
 29- mlock
 30	tests for mlock(2)
 31- mremap
 32	tests for mremap(2)
 33- hugevm
 34	tests for very large virtual address space
 35- vmalloc
 36	vmalloc smoke tests
 37- hmm
 38	hmm smoke tests
 39- madv_populate
 40	test memadvise(2) MADV_POPULATE_{READ,WRITE} options
 41- memfd_secret
 42	test memfd_secret(2)
 43- process_mrelease
 44	test process_mrelease(2)
 45- ksm
 46	ksm tests that do not require >=2 NUMA nodes
 47- ksm_numa
 48	ksm tests that require >=2 NUMA nodes
 49- pkey
 50	memory protection key tests
 51- soft_dirty
 52	test soft dirty page bit semantics
 53- cow
 54	test copy-on-write semantics
 55example: ./run_vmtests.sh -t "hmm mmap ksm"
 56EOF
 57	exit 0
 58}
 59
 60
 61while getopts "ht:" OPT; do
 62	case ${OPT} in
 63		"h") usage ;;
 64		"t") VM_SELFTEST_ITEMS=${OPTARG} ;;
 65	esac
 66done
 67shift $((OPTIND -1))
 68
 69# default behavior: run all tests
 70VM_SELFTEST_ITEMS=${VM_SELFTEST_ITEMS:-default}
 71
 72test_selected() {
 73	if [ "$VM_SELFTEST_ITEMS" == "default" ]; then
 74		# If no VM_SELFTEST_ITEMS are specified, run all tests
 75		return 0
 76	fi
 77	# If test selected argument is one of the test items
 78	if [[ " ${VM_SELFTEST_ITEMS[*]} " =~ " ${1} " ]]; then
 79	        return 0
 80	else
 81	        return 1
 82	fi
 83}
 84
 85# get huge pagesize and freepages from /proc/meminfo
 86while read -r name size unit; do
 87	if [ "$name" = "HugePages_Free:" ]; then
 88		freepgs="$size"
 89	fi
 90	if [ "$name" = "Hugepagesize:" ]; then
 91		hpgsize_KB="$size"
 92	fi
 93done < /proc/meminfo
 94
 95# Simple hugetlbfs tests have a hardcoded minimum requirement of
 96# huge pages totaling 256MB (262144KB) in size.  The userfaultfd
 97# hugetlb test requires a minimum of 2 * nr_cpus huge pages.  Take
 98# both of these requirements into account and attempt to increase
 99# number of huge pages available.
100nr_cpus=$(nproc)
101hpgsize_MB=$((hpgsize_KB / 1024))
102half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
103needmem_KB=$((half_ufd_size_MB * 2 * 1024))
104
105# set proper nr_hugepages
106if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
107	nr_hugepgs=$(cat /proc/sys/vm/nr_hugepages)
108	needpgs=$((needmem_KB / hpgsize_KB))
109	tries=2
110	while [ "$tries" -gt 0 ] && [ "$freepgs" -lt "$needpgs" ]; do
111		lackpgs=$((needpgs - freepgs))
112		echo 3 > /proc/sys/vm/drop_caches
113		if ! echo $((lackpgs + nr_hugepgs)) > /proc/sys/vm/nr_hugepages; then
114			echo "Please run this test as root"
115			exit $ksft_skip
116		fi
117		while read -r name size unit; do
118			if [ "$name" = "HugePages_Free:" ]; then
119				freepgs=$size
120			fi
121		done < /proc/meminfo
122		tries=$((tries - 1))
123	done
124	if [ "$freepgs" -lt "$needpgs" ]; then
125		printf "Not enough huge pages available (%d < %d)\n" \
126		       "$freepgs" "$needpgs"
127		exit 1
128	fi
129else
130	echo "no hugetlbfs support in kernel?"
131	exit 1
132fi
133
134# filter 64bit architectures
135ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
136if [ -z "$ARCH" ]; then
137	ARCH=$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/')
138fi
139VADDR64=0
140echo "$ARCH64STR" | grep "$ARCH" &>/dev/null && VADDR64=1
141
142# Usage: run_test [test binary] [arbitrary test arguments...]
143run_test() {
144	if test_selected ${CATEGORY}; then
145		local title="running $*"
146		local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
147		printf "%s\n%s\n%s\n" "$sep" "$title" "$sep"
148
149		"$@"
150		local ret=$?
151		if [ $ret -eq 0 ]; then
152			echo "[PASS]"
153		elif [ $ret -eq $ksft_skip ]; then
154			echo "[SKIP]"
155			exitcode=$ksft_skip
156		else
157			echo "[FAIL]"
158			exitcode=1
159		fi
160	fi # test_selected
161}
162
163CATEGORY="hugetlb" run_test ./hugepage-mmap
164
165shmmax=$(cat /proc/sys/kernel/shmmax)
166shmall=$(cat /proc/sys/kernel/shmall)
167echo 268435456 > /proc/sys/kernel/shmmax
168echo 4194304 > /proc/sys/kernel/shmall
169CATEGORY="hugetlb" run_test ./hugepage-shm
170echo "$shmmax" > /proc/sys/kernel/shmmax
171echo "$shmall" > /proc/sys/kernel/shmall
172
173CATEGORY="hugetlb" run_test ./map_hugetlb
174CATEGORY="hugetlb" run_test ./hugepage-mremap
175CATEGORY="hugetlb" run_test ./hugepage-vmemmap
176CATEGORY="hugetlb" run_test ./hugetlb-madvise
177
178if test_selected "hugetlb"; then
179	echo "NOTE: These hugetlb tests provide minimal coverage.  Use"
180	echo "      https://github.com/libhugetlbfs/libhugetlbfs.git for"
181	echo "      hugetlb regression testing."
182fi
183
184CATEGORY="mmap" run_test ./map_fixed_noreplace
185
186# get_user_pages_fast() benchmark
187CATEGORY="gup_test" run_test ./gup_test -u
188# pin_user_pages_fast() benchmark
189CATEGORY="gup_test" run_test ./gup_test -a
190# Dump pages 0, 19, and 4096, using pin_user_pages:
191CATEGORY="gup_test" run_test ./gup_test -ct -F 0x1 0 19 0x1000
192
193uffd_mods=("" ":dev")
194for mod in "${uffd_mods[@]}"; do
195	CATEGORY="userfaultfd" run_test ./userfaultfd anon${mod} 20 16
196	# Hugetlb tests require source and destination huge pages. Pass in half
197	# the size ($half_ufd_size_MB), which is used for *each*.
198	CATEGORY="userfaultfd" run_test ./userfaultfd hugetlb${mod} "$half_ufd_size_MB" 32
199	CATEGORY="userfaultfd" run_test ./userfaultfd hugetlb_shared${mod} "$half_ufd_size_MB" 32
200	CATEGORY="userfaultfd" run_test ./userfaultfd shmem${mod} 20 16
201done
202
203#cleanup
204echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages
205
206CATEGORY="compaction" run_test ./compaction_test
207
208CATEGORY="mlock" run_test sudo -u nobody ./on-fault-limit
209
210CATEGORY="mmap" run_test ./map_populate
211
212CATEGORY="mlock" run_test ./mlock-random-test
213
214CATEGORY="mlock" run_test ./mlock2-tests
215
216CATEGORY="process_mrelease" run_test ./mrelease_test
217
218CATEGORY="mremap" run_test ./mremap_test
219
220CATEGORY="hugetlb" run_test ./thuge-gen
221
222if [ $VADDR64 -ne 0 ]; then
223	CATEGORY="hugevm" run_test ./virtual_address_range
224
225	# virtual address 128TB switch test
226	CATEGORY="hugevm" run_test ./va_128TBswitch.sh
227fi # VADDR64
228
229# vmalloc stability smoke test
230CATEGORY="vmalloc" run_test ./test_vmalloc.sh smoke
231
232CATEGORY="mremap" run_test ./mremap_dontunmap
233
234CATEGORY="hmm" run_test ./test_hmm.sh smoke
235
236# MADV_POPULATE_READ and MADV_POPULATE_WRITE tests
237CATEGORY="madv_populate" run_test ./madv_populate
238
239CATEGORY="memfd_secret" run_test ./memfd_secret
240
241# KSM MADV_MERGEABLE test with 10 identical pages
242CATEGORY="ksm" run_test ./ksm_tests -M -p 10
243# KSM unmerge test
244CATEGORY="ksm" run_test ./ksm_tests -U
245# KSM test with 10 zero pages and use_zero_pages = 0
246CATEGORY="ksm" run_test ./ksm_tests -Z -p 10 -z 0
247# KSM test with 10 zero pages and use_zero_pages = 1
248CATEGORY="ksm" run_test ./ksm_tests -Z -p 10 -z 1
249# KSM test with 2 NUMA nodes and merge_across_nodes = 1
250CATEGORY="ksm_numa" run_test ./ksm_tests -N -m 1
251# KSM test with 2 NUMA nodes and merge_across_nodes = 0
252CATEGORY="ksm_numa" run_test ./ksm_tests -N -m 0
253
254CATEGORY="ksm" run_test ./ksm_functional_tests
255
256run_test ./ksm_functional_tests
257
258# protection_keys tests
259if [ -x ./protection_keys_32 ]
260then
261	CATEGORY="pkey" run_test ./protection_keys_32
262fi
263
264if [ -x ./protection_keys_64 ]
265then
266	CATEGORY="pkey" run_test ./protection_keys_64
267fi
268
269CATEGORY="soft_dirty" run_test ./soft-dirty
270
271# COW tests
272CATEGORY="cow" run_test ./cow
273
274exit $exitcode