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
6 include local_config.mk
10 ifeq ($(CROSS_COMPILE
),)
11 uname_M
:= $(shell uname
-m
2>/dev
/null || echo not
)
13 uname_M
:= $(shell echo
$(CROSS_COMPILE
) | grep
-o
'^[a-z0-9]\+')
15 ARCH ?
= $(shell echo
$(uname_M
) | sed
-e
's/aarch64.*/arm64/' -e
's/ppc64.*/ppc64/')
18 # Without this, failed build products remain, with up-to-date timestamps,
19 # thus tricking Make (and you!) into believing that All Is Well, in subsequent
23 # Avoid accidental wrong builds, due to built-in rules working just a little
24 # bit too well--but not quite as well as required for our situation here.
26 # In other words, "make $SOME_TEST" is supposed to fail to build at all,
27 # because this Makefile only supports either "make" (all), or "make /full/path".
28 # However, the built-in rules, if not suppressed, will pick up CFLAGS and the
29 # initial LDLIBS (but not the target-specific LDLIBS, because those are only
30 # set for the full path target!). This causes it to get pretty far into building
31 # things despite using incorrect values such as an *occasionally* incomplete
33 MAKEFLAGS
+= --no-builtin-rules
35 CFLAGS
= -Wall
-I
$(top_srcdir
) $(EXTRA_CFLAGS
) $(KHDR_INCLUDES
)
36 LDLIBS
= -lrt
-lpthread
-lm
39 TEST_GEN_FILES
+= compaction_test
40 TEST_GEN_FILES
+= gup_longterm
41 TEST_GEN_FILES
+= gup_test
42 TEST_GEN_FILES
+= hmm-tests
43 TEST_GEN_FILES
+= hugetlb-madvise
44 TEST_GEN_FILES
+= hugetlb-read-hwpoison
45 TEST_GEN_FILES
+= hugepage-mmap
46 TEST_GEN_FILES
+= hugepage-mremap
47 TEST_GEN_FILES
+= hugepage-shm
48 TEST_GEN_FILES
+= hugepage-vmemmap
49 TEST_GEN_FILES
+= khugepaged
50 TEST_GEN_FILES
+= madv_populate
51 TEST_GEN_FILES
+= map_fixed_noreplace
52 TEST_GEN_FILES
+= map_hugetlb
53 TEST_GEN_FILES
+= map_populate
54 TEST_GEN_FILES
+= memfd_secret
55 TEST_GEN_FILES
+= migration
56 TEST_GEN_FILES
+= mkdirty
57 TEST_GEN_FILES
+= mlock-random-test
58 TEST_GEN_FILES
+= mlock2-tests
59 TEST_GEN_FILES
+= mrelease_test
60 TEST_GEN_FILES
+= mremap_dontunmap
61 TEST_GEN_FILES
+= mremap_test
62 TEST_GEN_FILES
+= on-fault-limit
63 TEST_GEN_FILES
+= pagemap_ioctl
64 TEST_GEN_FILES
+= thuge-gen
65 TEST_GEN_FILES
+= transhuge-stress
66 TEST_GEN_FILES
+= uffd-stress
67 TEST_GEN_FILES
+= uffd-unit-tests
68 TEST_GEN_FILES
+= split_huge_page_test
69 TEST_GEN_FILES
+= ksm_tests
70 TEST_GEN_FILES
+= ksm_functional_tests
71 TEST_GEN_FILES
+= mdwe_test
72 TEST_GEN_FILES
+= hugetlb_fault_after_madv
73 TEST_GEN_FILES
+= hugetlb_madv_vs_map
76 TEST_GEN_FILES
+= soft-dirty
80 CAN_BUILD_I386
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_32bit_program.c
-m32
)
81 CAN_BUILD_X86_64
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_64bit_program.c
)
82 CAN_BUILD_WITH_NOPIE
:= $(shell .
/..
/x86
/check_cc.sh
"$(CC)" ..
/x86
/trivial_program.c
-no-pie
)
84 VMTARGETS
:= protection_keys
85 BINARIES_32
:= $(VMTARGETS
:%=%_32
)
86 BINARIES_64
:= $(VMTARGETS
:%=%_64
)
88 ifeq ($(CAN_BUILD_WITH_NOPIE
),1)
92 ifeq ($(CAN_BUILD_I386
),1)
93 TEST_GEN_FILES
+= $(BINARIES_32
)
96 ifeq ($(CAN_BUILD_X86_64
),1)
97 TEST_GEN_FILES
+= $(BINARIES_64
)
101 ifneq (,$(findstring $(ARCH
),ppc64
))
102 TEST_GEN_FILES
+= protection_keys
107 ifneq (,$(filter $(ARCH
),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sparc64 x86_64
))
108 TEST_GEN_FILES
+= va_high_addr_switch
109 TEST_GEN_FILES
+= virtual_address_range
110 TEST_GEN_FILES
+= write_to_hugetlbfs
113 TEST_PROGS
:= run_vmtests.sh
115 TEST_FILES
:= test_vmalloc.sh
116 TEST_FILES
+= test_hmm.sh
117 TEST_FILES
+= va_high_addr_switch.sh
121 $(TEST_GEN_PROGS
): vm_util.c thp_settings.c
122 $(TEST_GEN_FILES
): vm_util.c thp_settings.c
124 $(OUTPUT
)/uffd-stress
: uffd-common.c
125 $(OUTPUT
)/uffd-unit-tests
: uffd-common.c
127 ifeq ($(ARCH
),x86_64
)
128 BINARIES_32
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_32
))
129 BINARIES_64
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_64
))
131 define gen-target-rule-32
132 $(1) $(1)_32
: $(OUTPUT
)/$(1)_32
136 define gen-target-rule-64
137 $(1) $(1)_64
: $(OUTPUT
)/$(1)_64
141 ifeq ($(CAN_BUILD_I386
),1)
142 $(BINARIES_32
): CFLAGS
+= -m32
-mxsave
143 $(BINARIES_32
): LDLIBS
+= -lrt
-ldl
-lm
144 $(BINARIES_32
): $(OUTPUT
)/%_32
: %.c
145 $(CC
) $(CFLAGS
) $(EXTRA_CFLAGS
) $(notdir $^
) $(LDLIBS
) -o
$@
146 $(foreach t
,$(VMTARGETS
),$(eval
$(call gen-target-rule-32
,$(t
))))
149 ifeq ($(CAN_BUILD_X86_64
),1)
150 $(BINARIES_64
): CFLAGS
+= -m64
-mxsave
151 $(BINARIES_64
): LDLIBS
+= -lrt
-ldl
152 $(BINARIES_64
): $(OUTPUT
)/%_64
: %.c
153 $(CC
) $(CFLAGS
) $(EXTRA_CFLAGS
) $(notdir $^
) $(LDLIBS
) -o
$@
154 $(foreach t
,$(VMTARGETS
),$(eval
$(call gen-target-rule-64
,$(t
))))
157 # x86_64 users should be encouraged to install 32-bit libraries
158 ifeq ($(CAN_BUILD_I386
)$(CAN_BUILD_X86_64
),01)
159 all: warn_32bit_failure
162 @echo
"Warning: you seem to have a broken 32-bit build" 2>&1; \
163 echo
"environment. This will reduce test coverage of 64-bit" 2>&1; \
164 echo
"kernels. If you are using a Debian-like distribution," 2>&1; \
167 echo
" apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
169 echo
"If you are using a Fedora-like distribution, try:"; \
171 echo
" yum install glibc-devel.*i686"; \
176 # IOURING_EXTRA_LIBS may get set in local_config.mk, or it may be left empty.
177 $(OUTPUT
)/cow
: LDLIBS
+= $(IOURING_EXTRA_LIBS
)
179 $(OUTPUT
)/gup_longterm
: LDLIBS
+= $(IOURING_EXTRA_LIBS
)
181 $(OUTPUT
)/mlock-random-test
$(OUTPUT
)/memfd_secret
: LDLIBS
+= -lcap
183 $(OUTPUT
)/ksm_tests
: LDLIBS
+= -lnuma
185 $(OUTPUT
)/migration
: LDLIBS
+= -lnuma
187 local_config.mk local_config.h
: check_config.sh
188 /bin
/sh .
/check_config.sh
$(CC
)
190 EXTRA_CLEAN
+= local_config.mk local_config.h
192 ifeq ($(IOURING_EXTRA_LIBS
),)
193 all: warn_missing_liburing
195 warn_missing_liburing
:
197 echo
"Warning: missing liburing support. Some tests will be skipped." ; \