18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci#please run as root
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
68c2ecf20Sopenharmony_ciksft_skip=4
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cimnt=./huge
98c2ecf20Sopenharmony_ciexitcode=0
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#get huge pagesize and freepages from /proc/meminfo
128c2ecf20Sopenharmony_ciwhile read name size unit; do
138c2ecf20Sopenharmony_ci	if [ "$name" = "HugePages_Free:" ]; then
148c2ecf20Sopenharmony_ci		freepgs=$size
158c2ecf20Sopenharmony_ci	fi
168c2ecf20Sopenharmony_ci	if [ "$name" = "Hugepagesize:" ]; then
178c2ecf20Sopenharmony_ci		hpgsize_KB=$size
188c2ecf20Sopenharmony_ci	fi
198c2ecf20Sopenharmony_cidone < /proc/meminfo
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci# Simple hugetlbfs tests have a hardcoded minimum requirement of
228c2ecf20Sopenharmony_ci# huge pages totaling 256MB (262144KB) in size.  The userfaultfd
238c2ecf20Sopenharmony_ci# hugetlb test requires a minimum of 2 * nr_cpus huge pages.  Take
248c2ecf20Sopenharmony_ci# both of these requirements into account and attempt to increase
258c2ecf20Sopenharmony_ci# number of huge pages available.
268c2ecf20Sopenharmony_cinr_cpus=$(nproc)
278c2ecf20Sopenharmony_cihpgsize_MB=$((hpgsize_KB / 1024))
288c2ecf20Sopenharmony_cihalf_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
298c2ecf20Sopenharmony_cineedmem_KB=$((half_ufd_size_MB * 2 * 1024))
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#set proper nr_hugepages
328c2ecf20Sopenharmony_ciif [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
338c2ecf20Sopenharmony_ci	nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
348c2ecf20Sopenharmony_ci	needpgs=$((needmem_KB / hpgsize_KB))
358c2ecf20Sopenharmony_ci	tries=2
368c2ecf20Sopenharmony_ci	while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do
378c2ecf20Sopenharmony_ci		lackpgs=$(( $needpgs - $freepgs ))
388c2ecf20Sopenharmony_ci		echo 3 > /proc/sys/vm/drop_caches
398c2ecf20Sopenharmony_ci		echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
408c2ecf20Sopenharmony_ci		if [ $? -ne 0 ]; then
418c2ecf20Sopenharmony_ci			echo "Please run this test as root"
428c2ecf20Sopenharmony_ci			exit $ksft_skip
438c2ecf20Sopenharmony_ci		fi
448c2ecf20Sopenharmony_ci		while read name size unit; do
458c2ecf20Sopenharmony_ci			if [ "$name" = "HugePages_Free:" ]; then
468c2ecf20Sopenharmony_ci				freepgs=$size
478c2ecf20Sopenharmony_ci			fi
488c2ecf20Sopenharmony_ci		done < /proc/meminfo
498c2ecf20Sopenharmony_ci		tries=$((tries - 1))
508c2ecf20Sopenharmony_ci	done
518c2ecf20Sopenharmony_ci	if [ $freepgs -lt $needpgs ]; then
528c2ecf20Sopenharmony_ci		printf "Not enough huge pages available (%d < %d)\n" \
538c2ecf20Sopenharmony_ci		       $freepgs $needpgs
548c2ecf20Sopenharmony_ci		exit 1
558c2ecf20Sopenharmony_ci	fi
568c2ecf20Sopenharmony_cielse
578c2ecf20Sopenharmony_ci	echo "no hugetlbfs support in kernel?"
588c2ecf20Sopenharmony_ci	exit 1
598c2ecf20Sopenharmony_cifi
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#filter 64bit architectures
628c2ecf20Sopenharmony_ciARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
638c2ecf20Sopenharmony_ciif [ -z $ARCH ]; then
648c2ecf20Sopenharmony_ci  ARCH=`uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/'`
658c2ecf20Sopenharmony_cifi
668c2ecf20Sopenharmony_ciVADDR64=0
678c2ecf20Sopenharmony_ciecho "$ARCH64STR" | grep $ARCH && VADDR64=1
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_cimkdir $mnt
708c2ecf20Sopenharmony_cimount -t hugetlbfs none $mnt
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ciecho "---------------------"
738c2ecf20Sopenharmony_ciecho "running hugepage-mmap"
748c2ecf20Sopenharmony_ciecho "---------------------"
758c2ecf20Sopenharmony_ci./hugepage-mmap
768c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
778c2ecf20Sopenharmony_ci	echo "[FAIL]"
788c2ecf20Sopenharmony_ci	exitcode=1
798c2ecf20Sopenharmony_cielse
808c2ecf20Sopenharmony_ci	echo "[PASS]"
818c2ecf20Sopenharmony_cifi
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cishmmax=`cat /proc/sys/kernel/shmmax`
848c2ecf20Sopenharmony_cishmall=`cat /proc/sys/kernel/shmall`
858c2ecf20Sopenharmony_ciecho 268435456 > /proc/sys/kernel/shmmax
868c2ecf20Sopenharmony_ciecho 4194304 > /proc/sys/kernel/shmall
878c2ecf20Sopenharmony_ciecho "--------------------"
888c2ecf20Sopenharmony_ciecho "running hugepage-shm"
898c2ecf20Sopenharmony_ciecho "--------------------"
908c2ecf20Sopenharmony_ci./hugepage-shm
918c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
928c2ecf20Sopenharmony_ci	echo "[FAIL]"
938c2ecf20Sopenharmony_ci	exitcode=1
948c2ecf20Sopenharmony_cielse
958c2ecf20Sopenharmony_ci	echo "[PASS]"
968c2ecf20Sopenharmony_cifi
978c2ecf20Sopenharmony_ciecho $shmmax > /proc/sys/kernel/shmmax
988c2ecf20Sopenharmony_ciecho $shmall > /proc/sys/kernel/shmall
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciecho "-------------------"
1018c2ecf20Sopenharmony_ciecho "running map_hugetlb"
1028c2ecf20Sopenharmony_ciecho "-------------------"
1038c2ecf20Sopenharmony_ci./map_hugetlb
1048c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1058c2ecf20Sopenharmony_ci	echo "[FAIL]"
1068c2ecf20Sopenharmony_ci	exitcode=1
1078c2ecf20Sopenharmony_cielse
1088c2ecf20Sopenharmony_ci	echo "[PASS]"
1098c2ecf20Sopenharmony_cifi
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ciecho "NOTE: The above hugetlb tests provide minimal coverage.  Use"
1128c2ecf20Sopenharmony_ciecho "      https://github.com/libhugetlbfs/libhugetlbfs.git for"
1138c2ecf20Sopenharmony_ciecho "      hugetlb regression testing."
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ciecho "---------------------------"
1168c2ecf20Sopenharmony_ciecho "running map_fixed_noreplace"
1178c2ecf20Sopenharmony_ciecho "---------------------------"
1188c2ecf20Sopenharmony_ci./map_fixed_noreplace
1198c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1208c2ecf20Sopenharmony_ci	echo "[FAIL]"
1218c2ecf20Sopenharmony_ci	exitcode=1
1228c2ecf20Sopenharmony_cielse
1238c2ecf20Sopenharmony_ci	echo "[PASS]"
1248c2ecf20Sopenharmony_cifi
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ciecho "--------------------------------------------"
1278c2ecf20Sopenharmony_ciecho "running 'gup_benchmark -U' (normal/slow gup)"
1288c2ecf20Sopenharmony_ciecho "--------------------------------------------"
1298c2ecf20Sopenharmony_ci./gup_benchmark -U
1308c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1318c2ecf20Sopenharmony_ci	echo "[FAIL]"
1328c2ecf20Sopenharmony_ci	exitcode=1
1338c2ecf20Sopenharmony_cielse
1348c2ecf20Sopenharmony_ci	echo "[PASS]"
1358c2ecf20Sopenharmony_cifi
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ciecho "------------------------------------------"
1388c2ecf20Sopenharmony_ciecho "running gup_benchmark -b (pin_user_pages)"
1398c2ecf20Sopenharmony_ciecho "------------------------------------------"
1408c2ecf20Sopenharmony_ci./gup_benchmark -b
1418c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1428c2ecf20Sopenharmony_ci	echo "[FAIL]"
1438c2ecf20Sopenharmony_ci	exitcode=1
1448c2ecf20Sopenharmony_cielse
1458c2ecf20Sopenharmony_ci	echo "[PASS]"
1468c2ecf20Sopenharmony_cifi
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ciecho "-------------------"
1498c2ecf20Sopenharmony_ciecho "running userfaultfd"
1508c2ecf20Sopenharmony_ciecho "-------------------"
1518c2ecf20Sopenharmony_ci./userfaultfd anon 128 32
1528c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1538c2ecf20Sopenharmony_ci	echo "[FAIL]"
1548c2ecf20Sopenharmony_ci	exitcode=1
1558c2ecf20Sopenharmony_cielse
1568c2ecf20Sopenharmony_ci	echo "[PASS]"
1578c2ecf20Sopenharmony_cifi
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ciecho "---------------------------"
1608c2ecf20Sopenharmony_ciecho "running userfaultfd_hugetlb"
1618c2ecf20Sopenharmony_ciecho "---------------------------"
1628c2ecf20Sopenharmony_ci# Test requires source and destination huge pages.  Size of source
1638c2ecf20Sopenharmony_ci# (half_ufd_size_MB) is passed as argument to test.
1648c2ecf20Sopenharmony_ci./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
1658c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1668c2ecf20Sopenharmony_ci	echo "[FAIL]"
1678c2ecf20Sopenharmony_ci	exitcode=1
1688c2ecf20Sopenharmony_cielse
1698c2ecf20Sopenharmony_ci	echo "[PASS]"
1708c2ecf20Sopenharmony_cifi
1718c2ecf20Sopenharmony_cirm -f $mnt/ufd_test_file
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ciecho "-------------------------"
1748c2ecf20Sopenharmony_ciecho "running userfaultfd_shmem"
1758c2ecf20Sopenharmony_ciecho "-------------------------"
1768c2ecf20Sopenharmony_ci./userfaultfd shmem 128 32
1778c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1788c2ecf20Sopenharmony_ci	echo "[FAIL]"
1798c2ecf20Sopenharmony_ci	exitcode=1
1808c2ecf20Sopenharmony_cielse
1818c2ecf20Sopenharmony_ci	echo "[PASS]"
1828c2ecf20Sopenharmony_cifi
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci#cleanup
1858c2ecf20Sopenharmony_ciumount $mnt
1868c2ecf20Sopenharmony_cirm -rf $mnt
1878c2ecf20Sopenharmony_ciecho $nr_hugepgs > /proc/sys/vm/nr_hugepages
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ciecho "-----------------------"
1908c2ecf20Sopenharmony_ciecho "running compaction_test"
1918c2ecf20Sopenharmony_ciecho "-----------------------"
1928c2ecf20Sopenharmony_ci./compaction_test
1938c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
1948c2ecf20Sopenharmony_ci	echo "[FAIL]"
1958c2ecf20Sopenharmony_ci	exitcode=1
1968c2ecf20Sopenharmony_cielse
1978c2ecf20Sopenharmony_ci	echo "[PASS]"
1988c2ecf20Sopenharmony_cifi
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ciecho "----------------------"
2018c2ecf20Sopenharmony_ciecho "running on-fault-limit"
2028c2ecf20Sopenharmony_ciecho "----------------------"
2038c2ecf20Sopenharmony_cisudo -u nobody ./on-fault-limit
2048c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2058c2ecf20Sopenharmony_ci	echo "[FAIL]"
2068c2ecf20Sopenharmony_ci	exitcode=1
2078c2ecf20Sopenharmony_cielse
2088c2ecf20Sopenharmony_ci	echo "[PASS]"
2098c2ecf20Sopenharmony_cifi
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ciecho "--------------------"
2128c2ecf20Sopenharmony_ciecho "running map_populate"
2138c2ecf20Sopenharmony_ciecho "--------------------"
2148c2ecf20Sopenharmony_ci./map_populate
2158c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2168c2ecf20Sopenharmony_ci	echo "[FAIL]"
2178c2ecf20Sopenharmony_ci	exitcode=1
2188c2ecf20Sopenharmony_cielse
2198c2ecf20Sopenharmony_ci	echo "[PASS]"
2208c2ecf20Sopenharmony_cifi
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ciecho "-------------------------"
2238c2ecf20Sopenharmony_ciecho "running mlock-random-test"
2248c2ecf20Sopenharmony_ciecho "-------------------------"
2258c2ecf20Sopenharmony_ci./mlock-random-test
2268c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2278c2ecf20Sopenharmony_ci	echo "[FAIL]"
2288c2ecf20Sopenharmony_ci	exitcode=1
2298c2ecf20Sopenharmony_cielse
2308c2ecf20Sopenharmony_ci	echo "[PASS]"
2318c2ecf20Sopenharmony_cifi
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ciecho "--------------------"
2348c2ecf20Sopenharmony_ciecho "running mlock2-tests"
2358c2ecf20Sopenharmony_ciecho "--------------------"
2368c2ecf20Sopenharmony_ci./mlock2-tests
2378c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2388c2ecf20Sopenharmony_ci	echo "[FAIL]"
2398c2ecf20Sopenharmony_ci	exitcode=1
2408c2ecf20Sopenharmony_cielse
2418c2ecf20Sopenharmony_ci	echo "[PASS]"
2428c2ecf20Sopenharmony_cifi
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ciecho "-----------------"
2458c2ecf20Sopenharmony_ciecho "running thuge-gen"
2468c2ecf20Sopenharmony_ciecho "-----------------"
2478c2ecf20Sopenharmony_ci./thuge-gen
2488c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2498c2ecf20Sopenharmony_ci	echo "[FAIL]"
2508c2ecf20Sopenharmony_ci	exitcode=1
2518c2ecf20Sopenharmony_cielse
2528c2ecf20Sopenharmony_ci	echo "[PASS]"
2538c2ecf20Sopenharmony_cifi
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ciif [ $VADDR64 -ne 0 ]; then
2568c2ecf20Sopenharmony_ciecho "-----------------------------"
2578c2ecf20Sopenharmony_ciecho "running virtual_address_range"
2588c2ecf20Sopenharmony_ciecho "-----------------------------"
2598c2ecf20Sopenharmony_ci./virtual_address_range
2608c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2618c2ecf20Sopenharmony_ci	echo "[FAIL]"
2628c2ecf20Sopenharmony_ci	exitcode=1
2638c2ecf20Sopenharmony_cielse
2648c2ecf20Sopenharmony_ci	echo "[PASS]"
2658c2ecf20Sopenharmony_cifi
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ciecho "-----------------------------"
2688c2ecf20Sopenharmony_ciecho "running virtual address 128TB switch test"
2698c2ecf20Sopenharmony_ciecho "-----------------------------"
2708c2ecf20Sopenharmony_ci./va_128TBswitch
2718c2ecf20Sopenharmony_ciif [ $? -ne 0 ]; then
2728c2ecf20Sopenharmony_ci    echo "[FAIL]"
2738c2ecf20Sopenharmony_ci    exitcode=1
2748c2ecf20Sopenharmony_cielse
2758c2ecf20Sopenharmony_ci    echo "[PASS]"
2768c2ecf20Sopenharmony_cifi
2778c2ecf20Sopenharmony_cifi # VADDR64
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ciecho "------------------------------------"
2808c2ecf20Sopenharmony_ciecho "running vmalloc stability smoke test"
2818c2ecf20Sopenharmony_ciecho "------------------------------------"
2828c2ecf20Sopenharmony_ci./test_vmalloc.sh smoke
2838c2ecf20Sopenharmony_ciret_val=$?
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ciif [ $ret_val -eq 0 ]; then
2868c2ecf20Sopenharmony_ci	echo "[PASS]"
2878c2ecf20Sopenharmony_cielif [ $ret_val -eq $ksft_skip ]; then
2888c2ecf20Sopenharmony_ci	 echo "[SKIP]"
2898c2ecf20Sopenharmony_ci	 exitcode=$ksft_skip
2908c2ecf20Sopenharmony_cielse
2918c2ecf20Sopenharmony_ci	echo "[FAIL]"
2928c2ecf20Sopenharmony_ci	exitcode=1
2938c2ecf20Sopenharmony_cifi
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ciecho "------------------------------------"
2968c2ecf20Sopenharmony_ciecho "running MREMAP_DONTUNMAP smoke test"
2978c2ecf20Sopenharmony_ciecho "------------------------------------"
2988c2ecf20Sopenharmony_ci./mremap_dontunmap
2998c2ecf20Sopenharmony_ciret_val=$?
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ciif [ $ret_val -eq 0 ]; then
3028c2ecf20Sopenharmony_ci	echo "[PASS]"
3038c2ecf20Sopenharmony_cielif [ $ret_val -eq $ksft_skip ]; then
3048c2ecf20Sopenharmony_ci	 echo "[SKIP]"
3058c2ecf20Sopenharmony_ci	 exitcode=$ksft_skip
3068c2ecf20Sopenharmony_cielse
3078c2ecf20Sopenharmony_ci	echo "[FAIL]"
3088c2ecf20Sopenharmony_ci	exitcode=1
3098c2ecf20Sopenharmony_cifi
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ciecho "running HMM smoke test"
3128c2ecf20Sopenharmony_ciecho "------------------------------------"
3138c2ecf20Sopenharmony_ci./test_hmm.sh smoke
3148c2ecf20Sopenharmony_ciret_val=$?
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ciif [ $ret_val -eq 0 ]; then
3178c2ecf20Sopenharmony_ci	echo "[PASS]"
3188c2ecf20Sopenharmony_cielif [ $ret_val -eq $ksft_skip ]; then
3198c2ecf20Sopenharmony_ci	echo "[SKIP]"
3208c2ecf20Sopenharmony_ci	exitcode=$ksft_skip
3218c2ecf20Sopenharmony_cielse
3228c2ecf20Sopenharmony_ci	echo "[FAIL]"
3238c2ecf20Sopenharmony_ci	exitcode=1
3248c2ecf20Sopenharmony_cifi
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ciexit $exitcode
327