Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #please run as root
0004 
0005 # Kselftest framework requirement - SKIP code is 4.
0006 ksft_skip=4
0007 
0008 mnt=./huge
0009 exitcode=0
0010 
0011 #get huge pagesize and freepages from /proc/meminfo
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 # Simple hugetlbfs tests have a hardcoded minimum requirement of
0022 # huge pages totaling 256MB (262144KB) in size.  The userfaultfd
0023 # hugetlb test requires a minimum of 2 * nr_cpus huge pages.  Take
0024 # both of these requirements into account and attempt to increase
0025 # number of huge pages available.
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 #set proper nr_hugepages
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 #filter 64bit architectures
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 # Usage: run_test [test binary] [arbitrary test arguments...]
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 # get_user_pages_fast() benchmark
0117 run_test ./gup_test -u
0118 # pin_user_pages_fast() benchmark
0119 run_test ./gup_test -a
0120 # Dump pages 0, 19, and 4096, using pin_user_pages:
0121 run_test ./gup_test -ct -F 0x1 0 19 0x1000
0122 
0123 run_test ./userfaultfd anon 20 16
0124 # Test requires source and destination huge pages.  Size of source
0125 # (half_ufd_size_MB) is passed as argument to test.
0126 run_test ./userfaultfd hugetlb "$half_ufd_size_MB" 32
0127 run_test ./userfaultfd shmem 20 16
0128 
0129 #cleanup
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         # virtual address 128TB switch test
0154         run_test ./va_128TBswitch.sh
0155 fi # VADDR64
0156 
0157 # vmalloc stability smoke test
0158 run_test ./test_vmalloc.sh smoke
0159 
0160 run_test ./mremap_dontunmap
0161 
0162 run_test ./test_hmm.sh smoke
0163 
0164 # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests
0165 run_test ./madv_populate
0166 
0167 run_test ./memfd_secret
0168 
0169 # KSM MADV_MERGEABLE test with 10 identical pages
0170 run_test ./ksm_tests -M -p 10
0171 # KSM unmerge test
0172 run_test ./ksm_tests -U
0173 # KSM test with 10 zero pages and use_zero_pages = 0
0174 run_test ./ksm_tests -Z -p 10 -z 0
0175 # KSM test with 10 zero pages and use_zero_pages = 1
0176 run_test ./ksm_tests -Z -p 10 -z 1
0177 # KSM test with 2 NUMA nodes and merge_across_nodes = 1
0178 run_test ./ksm_tests -N -m 1
0179 # KSM test with 2 NUMA nodes and merge_across_nodes = 0
0180 run_test ./ksm_tests -N -m 0
0181 
0182 # protection_keys tests
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