1 # SPDX-License-Identifier: GPL-2.0
2 # Makefile for mm selftests
4 LOCAL_HDRS
+= $(selfdir
)/mm
/local_config.h
$(top_srcdir
)/mm
/gup_test.h
5 LOCAL_HDRS
+= $(selfdir
)/mm
/mseal_helpers.h
7 include local_config.mk
11 ifeq ($(CROSS_COMPILE
),)
12 uname_M
:= $(shell uname
-m
2>/dev
/null || echo not
)
14 uname_M
:= $(shell echo
$(CROSS_COMPILE
) | grep
-o
'^[a-z0-9]\+')
16 ARCH ?
= $(shell echo
$(uname_M
) | sed
-e
's/aarch64.*/arm64/' -e
's/ppc64.*/powerpc/')
19 # Without this, failed build products remain, with up-to-date timestamps,
20 # thus tricking Make (and you!) into believing that All Is Well, in subsequent
24 # Avoid accidental wrong builds, due to built-in rules working just a little
25 # bit too well--but not quite as well as required for our situation here.
27 # In other words, "make $SOME_TEST" is supposed to fail to build at all,
28 # because this Makefile only supports either "make" (all), or "make /full/path".
29 # However, the built-in rules, if not suppressed, will pick up CFLAGS and the
30 # initial LDLIBS (but not the target-specific LDLIBS, because those are only
31 # set for the full path target!). This causes it to get pretty far into building
32 # things despite using incorrect values such as an *occasionally* incomplete
34 MAKEFLAGS
+= --no-builtin-rules
36 CFLAGS
= -Wall
-O2
-I
$(top_srcdir
) $(EXTRA_CFLAGS
) $(KHDR_INCLUDES
) $(TOOLS_INCLUDES
)
37 LDLIBS
= -lrt
-lpthread
-lm
39 # Some distributions (such as Ubuntu) configure GCC so that _FORTIFY_SOURCE is
40 # automatically enabled at -O1 or above. This triggers various unused-result
41 # warnings where functions such as read() or write() are called and their
42 # return value is not checked. Disable _FORTIFY_SOURCE to silence those
44 CFLAGS
+= -U_FORTIFY_SOURCE
46 KDIR ?
= /lib
/modules
/$(shell uname
-r
)/build
47 ifneq (,$(wildcard $(KDIR
)/Module.symvers
))
48 ifneq (,$(wildcard $(KDIR
)/include/linux
/page_frag_cache.h
))
49 TEST_GEN_MODS_DIR
:= page_frag
51 PAGE_FRAG_WARNING
= "missing page_frag_cache.h, please use a newer kernel"
54 PAGE_FRAG_WARNING
= "missing Module.symvers, please have the kernel built first"
58 TEST_GEN_FILES
+= compaction_test
59 TEST_GEN_FILES
+= gup_longterm
60 TEST_GEN_FILES
+= gup_test
61 TEST_GEN_FILES
+= hmm-tests
62 TEST_GEN_FILES
+= hugetlb-madvise
63 TEST_GEN_FILES
+= hugetlb-read-hwpoison
64 TEST_GEN_FILES
+= hugetlb-soft-offline
65 TEST_GEN_FILES
+= hugepage-mmap
66 TEST_GEN_FILES
+= hugepage-mremap
67 TEST_GEN_FILES
+= hugepage-shm
68 TEST_GEN_FILES
+= hugepage-vmemmap
69 TEST_GEN_FILES
+= khugepaged
70 TEST_GEN_FILES
+= madv_populate
71 TEST_GEN_FILES
+= map_fixed_noreplace
72 TEST_GEN_FILES
+= map_hugetlb
73 TEST_GEN_FILES
+= map_populate
74 ifneq (,$(filter $(ARCH
),arm64 riscv riscv64 x86 x86_64
))
75 TEST_GEN_FILES
+= memfd_secret
77 TEST_GEN_FILES
+= migration
78 TEST_GEN_FILES
+= mkdirty
79 TEST_GEN_FILES
+= mlock-random-test
80 TEST_GEN_FILES
+= mlock2-tests
81 TEST_GEN_FILES
+= mrelease_test
82 TEST_GEN_FILES
+= mremap_dontunmap
83 TEST_GEN_FILES
+= mremap_test
84 TEST_GEN_FILES
+= mseal_test
85 TEST_GEN_FILES
+= on-fault-limit
86 TEST_GEN_FILES
+= pagemap_ioctl
87 TEST_GEN_FILES
+= thuge-gen
88 TEST_GEN_FILES
+= transhuge-stress
89 TEST_GEN_FILES
+= uffd-stress
90 TEST_GEN_FILES
+= uffd-unit-tests
91 TEST_GEN_FILES
+= uffd-wp-mremap
92 TEST_GEN_FILES
+= split_huge_page_test
93 TEST_GEN_FILES
+= ksm_tests
94 TEST_GEN_FILES
+= ksm_functional_tests
95 TEST_GEN_FILES
+= mdwe_test
96 TEST_GEN_FILES
+= hugetlb_fault_after_madv
97 TEST_GEN_FILES
+= hugetlb_madv_vs_map
98 TEST_GEN_FILES
+= hugetlb_dio
99 TEST_GEN_FILES
+= droppable
100 TEST_GEN_FILES
+= guard-pages
102 ifneq ($(ARCH
),arm64
)
103 TEST_GEN_FILES
+= soft-dirty
106 ifeq ($(ARCH
),x86_64
)
107 CAN_BUILD_I386
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_32bit_program.c
-m32
)
108 CAN_BUILD_X86_64
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_64bit_program.c
)
109 CAN_BUILD_WITH_NOPIE
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_program.c
-no-pie
)
111 VMTARGETS
:= protection_keys
112 VMTARGETS
+= pkey_sighandler_tests
113 BINARIES_32
:= $(VMTARGETS
:%=%_32
)
114 BINARIES_64
:= $(VMTARGETS
:%=%_64
)
116 ifeq ($(CAN_BUILD_WITH_NOPIE
),1)
120 ifeq ($(CAN_BUILD_I386
),1)
121 TEST_GEN_FILES
+= $(BINARIES_32
)
124 ifeq ($(CAN_BUILD_X86_64
),1)
125 TEST_GEN_FILES
+= $(BINARIES_64
)
128 else ifeq ($(ARCH
),arm64
)
129 TEST_GEN_FILES
+= protection_keys
130 TEST_GEN_FILES
+= pkey_sighandler_tests
131 else ifeq ($(ARCH
),powerpc
)
132 TEST_GEN_FILES
+= protection_keys
135 ifneq (,$(filter $(ARCH
),arm64 mips64 parisc64 powerpc riscv64 s390x sparc64 x86_64 s390
))
136 TEST_GEN_FILES
+= va_high_addr_switch
137 ifneq ($(ARCH
),riscv64
)
138 TEST_GEN_FILES
+= virtual_address_range
140 TEST_GEN_FILES
+= write_to_hugetlbfs
143 TEST_PROGS
:= run_vmtests.sh
145 TEST_FILES
:= test_vmalloc.sh
146 TEST_FILES
+= test_hmm.sh
147 TEST_FILES
+= va_high_addr_switch.sh
148 TEST_FILES
+= charge_reserved_hugetlb.sh
149 TEST_FILES
+= hugetlb_reparenting_test.sh
150 TEST_FILES
+= test_page_frag.sh
152 # required by charge_reserved_hugetlb.sh
153 TEST_FILES
+= write_hugetlb_memory.sh
157 $(TEST_GEN_PROGS
): vm_util.c thp_settings.c
158 $(TEST_GEN_FILES
): vm_util.c thp_settings.c
160 $(OUTPUT
)/uffd-stress
: uffd-common.c
161 $(OUTPUT
)/uffd-unit-tests
: uffd-common.c
162 $(OUTPUT
)/uffd-wp-mremap
: uffd-common.c
163 $(OUTPUT
)/protection_keys
: pkey_util.c
164 $(OUTPUT
)/pkey_sighandler_tests
: pkey_util.c
166 ifeq ($(ARCH
),x86_64
)
167 BINARIES_32
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_32
))
168 BINARIES_64
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_64
))
170 $(BINARIES_32
) $(BINARIES_64
): pkey_util.c
172 define gen-target-rule-32
173 $(1) $(1)_32
: $(OUTPUT
)/$(1)_32
177 define gen-target-rule-64
178 $(1) $(1)_64
: $(OUTPUT
)/$(1)_64
182 ifeq ($(CAN_BUILD_I386
),1)
183 $(BINARIES_32
): CFLAGS
+= -m32
-mxsave
184 $(BINARIES_32
): LDLIBS
+= -lrt
-ldl
-lm
185 $(BINARIES_32
): $(OUTPUT
)/%_32
: %.c
186 $(CC
) $(CFLAGS
) $(EXTRA_CFLAGS
) $(notdir $^
) $(LDLIBS
) -o
$@
187 $(foreach t
,$(VMTARGETS
),$(eval
$(call gen-target-rule-32
,$(t
))))
190 ifeq ($(CAN_BUILD_X86_64
),1)
191 $(BINARIES_64
): CFLAGS
+= -m64
-mxsave
192 $(BINARIES_64
): LDLIBS
+= -lrt
-ldl
193 $(BINARIES_64
): $(OUTPUT
)/%_64
: %.c
194 $(CC
) $(CFLAGS
) $(EXTRA_CFLAGS
) $(notdir $^
) $(LDLIBS
) -o
$@
195 $(foreach t
,$(VMTARGETS
),$(eval
$(call gen-target-rule-64
,$(t
))))
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
203 @echo
"Warning: you seem to have a broken 32-bit build" 2>&1; \
204 echo
"environment. This will reduce test coverage of 64-bit" 2>&1; \
205 echo
"kernels. If you are using a Debian-like distribution," 2>&1; \
208 echo
" apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
210 echo
"If you are using a Fedora-like distribution, try:"; \
212 echo
" yum install glibc-devel.*i686"; \
217 # IOURING_EXTRA_LIBS may get set in local_config.mk, or it may be left empty.
218 $(OUTPUT
)/cow
: LDLIBS
+= $(IOURING_EXTRA_LIBS
)
220 $(OUTPUT
)/gup_longterm
: LDLIBS
+= $(IOURING_EXTRA_LIBS
)
222 $(OUTPUT
)/mlock-random-test
$(OUTPUT
)/memfd_secret
: LDLIBS
+= -lcap
224 $(OUTPUT
)/ksm_tests
: LDLIBS
+= -lnuma
226 $(OUTPUT
)/migration
: LDLIBS
+= -lnuma
228 local_config.mk local_config.h
: check_config.sh
229 /bin
/sh .
/check_config.sh
$(CC
)
231 EXTRA_CLEAN
+= local_config.mk local_config.h
233 ifeq ($(IOURING_EXTRA_LIBS
),)
234 all: warn_missing_liburing
236 warn_missing_liburing
:
238 echo
"Warning: missing liburing support. Some tests will be skipped." ; \
242 ifneq ($(PAGE_FRAG_WARNING
),)
243 all: warn_missing_page_frag
245 warn_missing_page_frag
:
247 echo
"Warning: $(PAGE_FRAG_WARNING). page_frag test will be skipped." ; \