0001
0002
0003
0004
0005
0006 ksft_skip=4
0007
0008 mnt=./huge
0009 exitcode=0
0010
0011
0012 while read -r name size unit; do
0013 if [ "$name" = "HugePages_Free:" ]; then
0014 freepgs="$size"
0015 fi
0016 if [ "$name" = "Hugepagesize:" ]; then
0017 hpgsize_KB="$size"
0018 fi
0019 done < /proc/meminfo
0020
0021
0022
0023
0024
0025
0026 nr_cpus=$(nproc)
0027 hpgsize_MB=$((hpgsize_KB / 1024))
0028 half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
0029 needmem_KB=$((half_ufd_size_MB * 2 * 1024))
0030
0031
0032 if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
0033 nr_hugepgs=$(cat /proc/sys/vm/nr_hugepages)
0034 needpgs=$((needmem_KB / hpgsize_KB))
0035 tries=2
0036 while [ "$tries" -gt 0 ] && [ "$freepgs" -lt "$needpgs" ]; do
0037 lackpgs=$((needpgs - freepgs))
0038 echo 3 > /proc/sys/vm/drop_caches
0039 if ! echo $((lackpgs + nr_hugepgs)) > /proc/sys/vm/nr_hugepages; then
0040 echo "Please run this test as root"
0041 exit $ksft_skip
0042 fi
0043 while read -r name size unit; do
0044 if [ "$name" = "HugePages_Free:" ]; then
0045 freepgs=$size
0046 fi
0047 done < /proc/meminfo
0048 tries=$((tries - 1))
0049 done
0050 if [ "$freepgs" -lt "$needpgs" ]; then
0051 printf "Not enough huge pages available (%d < %d)\n" \
0052 "$freepgs" "$needpgs"
0053 exit 1
0054 fi
0055 else
0056 echo "no hugetlbfs support in kernel?"
0057 exit 1
0058 fi
0059
0060
0061 ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
0062 if [ -z "$ARCH" ]; then
0063 ARCH=$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/')
0064 fi
0065 VADDR64=0
0066 echo "$ARCH64STR" | grep "$ARCH" && VADDR64=1
0067
0068
0069 run_test() {
0070 local title="running $*"
0071 local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
0072 printf "%s\n%s\n%s\n" "$sep" "$title" "$sep"
0073
0074 "$@"
0075 local ret=$?
0076 if [ $ret -eq 0 ]; then
0077 echo "[PASS]"
0078 elif [ $ret -eq $ksft_skip ]; then
0079 echo "[SKIP]"
0080 exitcode=$ksft_skip
0081 else
0082 echo "[FAIL]"
0083 exitcode=1
0084 fi
0085 }
0086
0087 mkdir "$mnt"
0088 mount -t hugetlbfs none "$mnt"
0089
0090 run_test ./hugepage-mmap
0091
0092 shmmax=$(cat /proc/sys/kernel/shmmax)
0093 shmall=$(cat /proc/sys/kernel/shmall)
0094 echo 268435456 > /proc/sys/kernel/shmmax
0095 echo 4194304 > /proc/sys/kernel/shmall
0096 run_test ./hugepage-shm
0097 echo "$shmmax" > /proc/sys/kernel/shmmax
0098 echo "$shmall" > /proc/sys/kernel/shmall
0099
0100 run_test ./map_hugetlb
0101
0102 run_test ./hugepage-mremap "$mnt"/huge_mremap
0103 rm -f "$mnt"/huge_mremap
0104
0105 run_test ./hugepage-vmemmap
0106
0107 run_test ./hugetlb-madvise "$mnt"/madvise-test
0108 rm -f "$mnt"/madvise-test
0109
0110 echo "NOTE: The above hugetlb tests provide minimal coverage. Use"
0111 echo " https://github.com/libhugetlbfs/libhugetlbfs.git for"
0112 echo " hugetlb regression testing."
0113
0114 run_test ./map_fixed_noreplace
0115
0116
0117 run_test ./gup_test -u
0118
0119 run_test ./gup_test -a
0120
0121 run_test ./gup_test -ct -F 0x1 0 19 0x1000
0122
0123 run_test ./userfaultfd anon 20 16
0124
0125
0126 run_test ./userfaultfd hugetlb "$half_ufd_size_MB" 32
0127 run_test ./userfaultfd shmem 20 16
0128
0129
0130 umount "$mnt"
0131 rm -rf "$mnt"
0132 echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages
0133
0134 run_test ./compaction_test
0135
0136 run_test sudo -u nobody ./on-fault-limit
0137
0138 run_test ./map_populate
0139
0140 run_test ./mlock-random-test
0141
0142 run_test ./mlock2-tests
0143
0144 run_test ./mrelease_test
0145
0146 run_test ./mremap_test
0147
0148 run_test ./thuge-gen
0149
0150 if [ $VADDR64 -ne 0 ]; then
0151 run_test ./virtual_address_range
0152
0153
0154 run_test ./va_128TBswitch.sh
0155 fi
0156
0157
0158 run_test ./test_vmalloc.sh smoke
0159
0160 run_test ./mremap_dontunmap
0161
0162 run_test ./test_hmm.sh smoke
0163
0164
0165 run_test ./madv_populate
0166
0167 run_test ./memfd_secret
0168
0169
0170 run_test ./ksm_tests -M -p 10
0171
0172 run_test ./ksm_tests -U
0173
0174 run_test ./ksm_tests -Z -p 10 -z 0
0175
0176 run_test ./ksm_tests -Z -p 10 -z 1
0177
0178 run_test ./ksm_tests -N -m 1
0179
0180 run_test ./ksm_tests -N -m 0
0181
0182
0183 if [ -x ./protection_keys_32 ]
0184 then
0185 run_test ./protection_keys_32
0186 fi
0187
0188 if [ -x ./protection_keys_64 ]
0189 then
0190 run_test ./protection_keys_64
0191 fi
0192
0193 run_test ./soft-dirty
0194
0195 exit $exitcode