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