Makefile 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. # SPDX-License-Identifier: GPL-2.0
  2. # Makefile for mm selftests
  3. # IMPORTANT: If you add a new test CATEGORY please add a simple wrapper
  4. # script so kunit knows to run it, and add it to the list below.
  5. # If you do not YOUR TESTS WILL NOT RUN IN THE CI.
  6. LOCAL_HDRS += $(selfdir)/mm/local_config.h $(top_srcdir)/mm/gup_test.h
  7. LOCAL_HDRS += $(selfdir)/mm/mseal_helpers.h
  8. include local_config.mk
  9. ifeq ($(ARCH),)
  10. ifeq ($(CROSS_COMPILE),)
  11. uname_M := $(shell uname -m 2>/dev/null || echo not)
  12. else
  13. uname_M := $(shell echo $(CROSS_COMPILE) | grep -o '^[a-z0-9]\+')
  14. endif
  15. ARCH ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/powerpc/')
  16. endif
  17. # Without this, failed build products remain, with up-to-date timestamps,
  18. # thus tricking Make (and you!) into believing that All Is Well, in subsequent
  19. # make invocations:
  20. .DELETE_ON_ERROR:
  21. # Avoid accidental wrong builds, due to built-in rules working just a little
  22. # bit too well--but not quite as well as required for our situation here.
  23. #
  24. # In other words, "make $SOME_TEST" is supposed to fail to build at all,
  25. # because this Makefile only supports either "make" (all), or "make /full/path".
  26. # However, the built-in rules, if not suppressed, will pick up CFLAGS and the
  27. # initial LDLIBS (but not the target-specific LDLIBS, because those are only
  28. # set for the full path target!). This causes it to get pretty far into building
  29. # things despite using incorrect values such as an *occasionally* incomplete
  30. # LDLIBS.
  31. MAKEFLAGS += --no-builtin-rules
  32. CFLAGS = -Wall -O2 -I $(top_srcdir) $(EXTRA_CFLAGS) $(KHDR_INCLUDES) $(TOOLS_INCLUDES)
  33. CFLAGS += -Wunreachable-code
  34. LDLIBS = -lrt -lpthread -lm
  35. # Some distributions (such as Ubuntu) configure GCC so that _FORTIFY_SOURCE is
  36. # automatically enabled at -O1 or above. This triggers various unused-result
  37. # warnings where functions such as read() or write() are called and their
  38. # return value is not checked. Disable _FORTIFY_SOURCE to silence those
  39. # warnings.
  40. CFLAGS += -U_FORTIFY_SOURCE
  41. KDIR ?= $(if $(O),$(O),$(realpath ../../../..))
  42. ifneq (,$(wildcard $(KDIR)/Module.symvers))
  43. TEST_GEN_MODS_DIR := page_frag
  44. else
  45. PAGE_FRAG_WARNING = "missing Module.symvers, please have the kernel built first"
  46. endif
  47. TEST_GEN_FILES = cow
  48. TEST_GEN_FILES += compaction_test
  49. TEST_GEN_FILES += gup_longterm
  50. TEST_GEN_FILES += gup_test
  51. TEST_GEN_FILES += hmm-tests
  52. TEST_GEN_FILES += hugetlb-madvise
  53. TEST_GEN_FILES += hugetlb-read-hwpoison
  54. TEST_GEN_FILES += hugetlb-soft-offline
  55. TEST_GEN_FILES += hugepage-mmap
  56. TEST_GEN_FILES += hugepage-mremap
  57. TEST_GEN_FILES += hugepage-shm
  58. TEST_GEN_FILES += hugepage-vmemmap
  59. TEST_GEN_FILES += khugepaged
  60. TEST_GEN_FILES += madv_populate
  61. TEST_GEN_FILES += map_fixed_noreplace
  62. TEST_GEN_FILES += map_hugetlb
  63. TEST_GEN_FILES += map_populate
  64. ifneq (,$(filter $(ARCH),arm64 riscv riscv64 x86 x86_64 loongarch32 loongarch64))
  65. TEST_GEN_FILES += memfd_secret
  66. endif
  67. TEST_GEN_FILES += memory-failure
  68. TEST_GEN_FILES += migration
  69. TEST_GEN_FILES += mkdirty
  70. TEST_GEN_FILES += mlock-random-test
  71. TEST_GEN_FILES += mlock2-tests
  72. TEST_GEN_FILES += mrelease_test
  73. TEST_GEN_FILES += mremap_dontunmap
  74. TEST_GEN_FILES += mremap_test
  75. TEST_GEN_FILES += mseal_test
  76. TEST_GEN_FILES += on-fault-limit
  77. TEST_GEN_FILES += pagemap_ioctl
  78. TEST_GEN_FILES += pfnmap
  79. TEST_GEN_FILES += process_madv
  80. TEST_GEN_FILES += prctl_thp_disable
  81. TEST_GEN_FILES += thuge-gen
  82. TEST_GEN_FILES += transhuge-stress
  83. TEST_GEN_FILES += uffd-stress
  84. TEST_GEN_FILES += uffd-unit-tests
  85. TEST_GEN_FILES += uffd-wp-mremap
  86. TEST_GEN_FILES += split_huge_page_test
  87. TEST_GEN_FILES += ksm_tests
  88. TEST_GEN_FILES += ksm_functional_tests
  89. TEST_GEN_FILES += mdwe_test
  90. TEST_GEN_FILES += hugetlb_fault_after_madv
  91. TEST_GEN_FILES += hugetlb_madv_vs_map
  92. TEST_GEN_FILES += hugetlb_dio
  93. TEST_GEN_FILES += droppable
  94. TEST_GEN_FILES += guard-regions
  95. TEST_GEN_FILES += merge
  96. TEST_GEN_FILES += rmap
  97. ifneq ($(ARCH),arm64)
  98. TEST_GEN_FILES += soft-dirty
  99. endif
  100. ifeq ($(ARCH),x86_64)
  101. CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_32bit_program.c -m32)
  102. CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_64bit_program.c)
  103. CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_program.c -no-pie)
  104. VMTARGETS := protection_keys
  105. VMTARGETS += pkey_sighandler_tests
  106. BINARIES_32 := $(VMTARGETS:%=%_32)
  107. BINARIES_64 := $(VMTARGETS:%=%_64)
  108. ifeq ($(CAN_BUILD_WITH_NOPIE),1)
  109. CFLAGS += -no-pie
  110. endif
  111. ifeq ($(CAN_BUILD_I386),1)
  112. TEST_GEN_FILES += $(BINARIES_32)
  113. endif
  114. ifeq ($(CAN_BUILD_X86_64),1)
  115. TEST_GEN_FILES += $(BINARIES_64)
  116. endif
  117. else ifeq ($(ARCH),arm64)
  118. TEST_GEN_FILES += protection_keys
  119. TEST_GEN_FILES += pkey_sighandler_tests
  120. else ifeq ($(ARCH),powerpc)
  121. TEST_GEN_FILES += protection_keys
  122. endif
  123. ifneq (,$(filter $(ARCH),arm64 mips64 parisc64 powerpc riscv64 s390x sparc64 x86_64 s390))
  124. TEST_GEN_FILES += va_high_addr_switch
  125. TEST_GEN_FILES += write_to_hugetlbfs
  126. endif
  127. TEST_PROGS += ksft_compaction.sh
  128. TEST_PROGS += ksft_cow.sh
  129. TEST_PROGS += ksft_gup_test.sh
  130. TEST_PROGS += ksft_hmm.sh
  131. TEST_PROGS += ksft_hugetlb.sh
  132. TEST_PROGS += ksft_hugevm.sh
  133. TEST_PROGS += ksft_ksm.sh
  134. TEST_PROGS += ksft_ksm_numa.sh
  135. TEST_PROGS += ksft_madv_guard.sh
  136. TEST_PROGS += ksft_madv_populate.sh
  137. TEST_PROGS += ksft_memfd_secret.sh
  138. TEST_PROGS += ksft_memory_failure.sh
  139. TEST_PROGS += ksft_migration.sh
  140. TEST_PROGS += ksft_mkdirty.sh
  141. TEST_PROGS += ksft_mlock.sh
  142. TEST_PROGS += ksft_mmap.sh
  143. TEST_PROGS += ksft_mremap.sh
  144. TEST_PROGS += ksft_pagemap.sh
  145. TEST_PROGS += ksft_pfnmap.sh
  146. TEST_PROGS += ksft_pkey.sh
  147. TEST_PROGS += ksft_process_madv.sh
  148. TEST_PROGS += ksft_process_mrelease.sh
  149. TEST_PROGS += ksft_rmap.sh
  150. TEST_PROGS += ksft_soft_dirty.sh
  151. TEST_PROGS += ksft_thp.sh
  152. TEST_PROGS += ksft_userfaultfd.sh
  153. TEST_PROGS += ksft_vma_merge.sh
  154. TEST_PROGS += ksft_vmalloc.sh
  155. TEST_FILES := test_vmalloc.sh
  156. TEST_FILES += test_hmm.sh
  157. TEST_FILES += va_high_addr_switch.sh
  158. TEST_FILES += charge_reserved_hugetlb.sh
  159. TEST_FILES += hugetlb_reparenting_test.sh
  160. TEST_FILES += test_page_frag.sh
  161. TEST_FILES += run_vmtests.sh
  162. # required by charge_reserved_hugetlb.sh
  163. TEST_FILES += write_hugetlb_memory.sh
  164. include ../lib.mk
  165. $(TEST_GEN_PROGS): vm_util.c thp_settings.c
  166. $(TEST_GEN_FILES): vm_util.c thp_settings.c
  167. $(OUTPUT)/uffd-stress: uffd-common.c
  168. $(OUTPUT)/uffd-unit-tests: uffd-common.c
  169. $(OUTPUT)/uffd-wp-mremap: uffd-common.c
  170. $(OUTPUT)/protection_keys: pkey_util.c
  171. $(OUTPUT)/pkey_sighandler_tests: pkey_util.c
  172. ifeq ($(ARCH),x86_64)
  173. BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))
  174. BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64))
  175. $(BINARIES_32) $(BINARIES_64): pkey_util.c
  176. define gen-target-rule-32
  177. $(1) $(1)_32: $(OUTPUT)/$(1)_32
  178. .PHONY: $(1) $(1)_32
  179. endef
  180. define gen-target-rule-64
  181. $(1) $(1)_64: $(OUTPUT)/$(1)_64
  182. .PHONY: $(1) $(1)_64
  183. endef
  184. ifeq ($(CAN_BUILD_I386),1)
  185. $(BINARIES_32): CFLAGS += -m32 -mxsave
  186. $(BINARIES_32): LDLIBS += -lrt -ldl -lm
  187. $(BINARIES_32): $(OUTPUT)/%_32: %.c
  188. $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
  189. $(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-32,$(t))))
  190. endif
  191. ifeq ($(CAN_BUILD_X86_64),1)
  192. $(BINARIES_64): CFLAGS += -m64 -mxsave
  193. $(BINARIES_64): LDLIBS += -lrt -ldl
  194. $(BINARIES_64): $(OUTPUT)/%_64: %.c
  195. $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
  196. $(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-64,$(t))))
  197. endif
  198. # x86_64 users should be encouraged to install 32-bit libraries
  199. ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01)
  200. all: warn_32bit_failure
  201. warn_32bit_failure:
  202. @echo "Warning: you seem to have a broken 32-bit build" 2>&1; \
  203. echo "environment. This will reduce test coverage of 64-bit" 2>&1; \
  204. echo "kernels. If you are using a Debian-like distribution," 2>&1; \
  205. echo "try:"; 2>&1; \
  206. echo ""; \
  207. echo " apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
  208. echo ""; \
  209. echo "If you are using a Fedora-like distribution, try:"; \
  210. echo ""; \
  211. echo " yum install glibc-devel.*i686"; \
  212. exit 0;
  213. endif
  214. endif
  215. # IOURING_EXTRA_LIBS may get set in local_config.mk, or it may be left empty.
  216. $(OUTPUT)/cow: LDLIBS += $(IOURING_EXTRA_LIBS)
  217. $(OUTPUT)/gup_longterm: LDLIBS += $(IOURING_EXTRA_LIBS)
  218. $(OUTPUT)/mlock-random-test $(OUTPUT)/memfd_secret: LDLIBS += -lcap
  219. $(OUTPUT)/ksm_tests: LDLIBS += -lnuma
  220. $(OUTPUT)/migration: LDLIBS += -lnuma
  221. $(OUTPUT)/rmap: LDLIBS += -lnuma
  222. local_config.mk local_config.h: check_config.sh
  223. CC="$(CC)" CFLAGS="$(CFLAGS)" ./check_config.sh
  224. EXTRA_CLEAN += local_config.mk local_config.h
  225. ifeq ($(IOURING_EXTRA_LIBS),)
  226. all: warn_missing_liburing
  227. warn_missing_liburing:
  228. @echo ; \
  229. echo "Warning: missing liburing support. Some tests will be skipped." ; \
  230. echo
  231. endif
  232. ifneq ($(PAGE_FRAG_WARNING),)
  233. all: warn_missing_page_frag
  234. warn_missing_page_frag:
  235. @echo ; \
  236. echo "Warning: $(PAGE_FRAG_WARNING). page_frag test will be skipped." ; \
  237. echo
  238. endif