run_vmtests.sh 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #please run as root
  4. # Kselftest framework requirement - SKIP code is 4.
  5. ksft_skip=4
  6. mnt=./huge
  7. exitcode=0
  8. #get huge pagesize and freepages from /proc/meminfo
  9. while read -r name size unit; do
  10. if [ "$name" = "HugePages_Free:" ]; then
  11. freepgs="$size"
  12. fi
  13. if [ "$name" = "Hugepagesize:" ]; then
  14. hpgsize_KB="$size"
  15. fi
  16. done < /proc/meminfo
  17. # Simple hugetlbfs tests have a hardcoded minimum requirement of
  18. # huge pages totaling 256MB (262144KB) in size. The userfaultfd
  19. # hugetlb test requires a minimum of 2 * nr_cpus huge pages. Take
  20. # both of these requirements into account and attempt to increase
  21. # number of huge pages available.
  22. nr_cpus=$(nproc)
  23. hpgsize_MB=$((hpgsize_KB / 1024))
  24. half_ufd_size_MB=$((((nr_cpus * hpgsize_MB + 127) / 128) * 128))
  25. needmem_KB=$((half_ufd_size_MB * 2 * 1024))
  26. #set proper nr_hugepages
  27. if [ -n "$freepgs" ] && [ -n "$hpgsize_KB" ]; then
  28. nr_hugepgs=$(cat /proc/sys/vm/nr_hugepages)
  29. needpgs=$((needmem_KB / hpgsize_KB))
  30. tries=2
  31. while [ "$tries" -gt 0 ] && [ "$freepgs" -lt "$needpgs" ]; do
  32. lackpgs=$((needpgs - freepgs))
  33. echo 3 > /proc/sys/vm/drop_caches
  34. if ! echo $((lackpgs + nr_hugepgs)) > /proc/sys/vm/nr_hugepages; then
  35. echo "Please run this test as root"
  36. exit $ksft_skip
  37. fi
  38. while read -r name size unit; do
  39. if [ "$name" = "HugePages_Free:" ]; then
  40. freepgs=$size
  41. fi
  42. done < /proc/meminfo
  43. tries=$((tries - 1))
  44. done
  45. if [ "$freepgs" -lt "$needpgs" ]; then
  46. printf "Not enough huge pages available (%d < %d)\n" \
  47. "$freepgs" "$needpgs"
  48. exit 1
  49. fi
  50. else
  51. echo "no hugetlbfs support in kernel?"
  52. exit 1
  53. fi
  54. #filter 64bit architectures
  55. ARCH64STR="arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64"
  56. if [ -z "$ARCH" ]; then
  57. ARCH=$(uname -m 2>/dev/null | sed -e 's/aarch64.*/arm64/')
  58. fi
  59. VADDR64=0
  60. echo "$ARCH64STR" | grep "$ARCH" && VADDR64=1
  61. # Usage: run_test [test binary] [arbitrary test arguments...]
  62. run_test() {
  63. local title="running $*"
  64. local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
  65. printf "%s\n%s\n%s\n" "$sep" "$title" "$sep"
  66. "$@"
  67. local ret=$?
  68. if [ $ret -eq 0 ]; then
  69. echo "[PASS]"
  70. elif [ $ret -eq $ksft_skip ]; then
  71. echo "[SKIP]"
  72. exitcode=$ksft_skip
  73. else
  74. echo "[FAIL]"
  75. exitcode=1
  76. fi
  77. }
  78. mkdir "$mnt"
  79. mount -t hugetlbfs none "$mnt"
  80. run_test ./hugepage-mmap
  81. shmmax=$(cat /proc/sys/kernel/shmmax)
  82. shmall=$(cat /proc/sys/kernel/shmall)
  83. echo 268435456 > /proc/sys/kernel/shmmax
  84. echo 4194304 > /proc/sys/kernel/shmall
  85. run_test ./hugepage-shm
  86. echo "$shmmax" > /proc/sys/kernel/shmmax
  87. echo "$shmall" > /proc/sys/kernel/shmall
  88. run_test ./map_hugetlb
  89. run_test ./hugepage-mremap "$mnt"/huge_mremap
  90. rm -f "$mnt"/huge_mremap
  91. run_test ./hugepage-vmemmap
  92. run_test ./hugetlb-madvise "$mnt"/madvise-test
  93. rm -f "$mnt"/madvise-test
  94. echo "NOTE: The above hugetlb tests provide minimal coverage. Use"
  95. echo " https://github.com/libhugetlbfs/libhugetlbfs.git for"
  96. echo " hugetlb regression testing."
  97. run_test ./map_fixed_noreplace
  98. # get_user_pages_fast() benchmark
  99. run_test ./gup_test -u
  100. # pin_user_pages_fast() benchmark
  101. run_test ./gup_test -a
  102. # Dump pages 0, 19, and 4096, using pin_user_pages:
  103. run_test ./gup_test -ct -F 0x1 0 19 0x1000
  104. uffd_mods=("" ":dev")
  105. for mod in "${uffd_mods[@]}"; do
  106. run_test ./userfaultfd anon${mod} 20 16
  107. # Hugetlb tests require source and destination huge pages. Pass in half
  108. # the size ($half_ufd_size_MB), which is used for *each*.
  109. run_test ./userfaultfd hugetlb${mod} "$half_ufd_size_MB" 32
  110. run_test ./userfaultfd hugetlb_shared${mod} "$half_ufd_size_MB" 32 "$mnt"/uffd-test
  111. rm -f "$mnt"/uffd-test
  112. run_test ./userfaultfd shmem${mod} 20 16
  113. done
  114. #cleanup
  115. umount "$mnt"
  116. rm -rf "$mnt"
  117. echo "$nr_hugepgs" > /proc/sys/vm/nr_hugepages
  118. run_test ./compaction_test
  119. run_test sudo -u nobody ./on-fault-limit
  120. run_test ./map_populate
  121. run_test ./mlock-random-test
  122. run_test ./mlock2-tests
  123. run_test ./mrelease_test
  124. run_test ./mremap_test
  125. run_test ./thuge-gen
  126. if [ $VADDR64 -ne 0 ]; then
  127. run_test ./virtual_address_range
  128. # virtual address 128TB switch test
  129. run_test ./va_128TBswitch.sh
  130. fi # VADDR64
  131. # vmalloc stability smoke test
  132. run_test ./test_vmalloc.sh smoke
  133. run_test ./mremap_dontunmap
  134. run_test ./test_hmm.sh smoke
  135. # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests
  136. run_test ./madv_populate
  137. run_test ./memfd_secret
  138. # KSM MADV_MERGEABLE test with 10 identical pages
  139. run_test ./ksm_tests -M -p 10
  140. # KSM unmerge test
  141. run_test ./ksm_tests -U
  142. # KSM test with 10 zero pages and use_zero_pages = 0
  143. run_test ./ksm_tests -Z -p 10 -z 0
  144. # KSM test with 10 zero pages and use_zero_pages = 1
  145. run_test ./ksm_tests -Z -p 10 -z 1
  146. # KSM test with 2 NUMA nodes and merge_across_nodes = 1
  147. run_test ./ksm_tests -N -m 1
  148. # KSM test with 2 NUMA nodes and merge_across_nodes = 0
  149. run_test ./ksm_tests -N -m 0
  150. # protection_keys tests
  151. if [ -x ./protection_keys_32 ]
  152. then
  153. run_test ./protection_keys_32
  154. fi
  155. if [ -x ./protection_keys_64 ]
  156. then
  157. run_test ./protection_keys_64
  158. fi
  159. run_test ./soft-dirty
  160. exit $exitcode