History

selftests/mm: fix additional build errors for selftests

These build errors only occur if one fails to first run "make headers". However, that is a non-obvious and instrusive requirement, and so there was a discussion on how to get rid of it [1]. This uses that solution. These two files were created by taking a snapshot of the generated header files that are created via "make headers". These two files were copied from ./usr/include/linux/ to ./tools/include/uapi/linux/ . That fixes the selftests/mm build on today's Arch Linux (which required the userfaultfd.h) and Ubuntu 23.04 (which additionally required memfd.h). [1] https://lore.kernel.org/all/783a4178-1dec-4e30-989a-5174b8176b09@redhat.com/

John Hubbard committed 2 years ago

Commit 580ea351 parent e076eac2 files · +425 −0Browse files

Showing the changes to tools/include/uapi/linux (2 of 2 files). Show all

Unified · Split

2 files
  1. tools/include/uapi/linux/memfd.h +39 −0
  2. tools/include/uapi/linux/userfaultfd.h +386 −0
tools/include/uapi/linux/memfd.h+39−0
@@ -0,0 +1,39 @@
1+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+#ifndef _LINUX_MEMFD_H
3+#define _LINUX_MEMFD_H
4+
5+#include <asm-generic/hugetlb_encode.h>
6+
7+/* flags for memfd_create(2) (unsigned int) */
8+#define MFD_CLOEXEC 0x0001U
9+#define MFD_ALLOW_SEALING 0x0002U
10+#define MFD_HUGETLB 0x0004U
11+/* not executable and sealed to prevent changing to executable. */
12+#define MFD_NOEXEC_SEAL 0x0008U
13+/* executable */
14+#define MFD_EXEC 0x0010U
15+
16+/*
17+ * Huge page size encoding when MFD_HUGETLB is specified, and a huge page
18+ * size other than the default is desired. See hugetlb_encode.h.
19+ * All known huge page size encodings are provided here. It is the
20+ * responsibility of the application to know which sizes are supported on
21+ * the running system. See mmap(2) man page for details.
22+ */
23+#define MFD_HUGE_SHIFT HUGETLB_FLAG_ENCODE_SHIFT
24+#define MFD_HUGE_MASK HUGETLB_FLAG_ENCODE_MASK
25+
26+#define MFD_HUGE_64KB HUGETLB_FLAG_ENCODE_64KB
27+#define MFD_HUGE_512KB HUGETLB_FLAG_ENCODE_512KB
28+#define MFD_HUGE_1MB HUGETLB_FLAG_ENCODE_1MB
29+#define MFD_HUGE_2MB HUGETLB_FLAG_ENCODE_2MB
30+#define MFD_HUGE_8MB HUGETLB_FLAG_ENCODE_8MB
31+#define MFD_HUGE_16MB HUGETLB_FLAG_ENCODE_16MB
32+#define MFD_HUGE_32MB HUGETLB_FLAG_ENCODE_32MB
33+#define MFD_HUGE_256MB HUGETLB_FLAG_ENCODE_256MB
34+#define MFD_HUGE_512MB HUGETLB_FLAG_ENCODE_512MB
35+#define MFD_HUGE_1GB HUGETLB_FLAG_ENCODE_1GB
36+#define MFD_HUGE_2GB HUGETLB_FLAG_ENCODE_2GB
37+#define MFD_HUGE_16GB HUGETLB_FLAG_ENCODE_16GB
38+
39+#endif /* _LINUX_MEMFD_H */
tools/include/uapi/linux/userfaultfd.h+386−0
@@ -0,0 +1,386 @@
1+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+/*
3+ * include/linux/userfaultfd.h
4+ *
5+ * Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org>
6+ * Copyright (C) 2015 Red Hat, Inc.
7+ *
8+ */
9+
10+#ifndef _LINUX_USERFAULTFD_H
11+#define _LINUX_USERFAULTFD_H
12+
13+#include <linux/types.h>
14+
15+/* ioctls for /dev/userfaultfd */
16+#define USERFAULTFD_IOC 0xAA
17+#define USERFAULTFD_IOC_NEW _IO(USERFAULTFD_IOC, 0x00)
18+
19+/*
20+ * If the UFFDIO_API is upgraded someday, the UFFDIO_UNREGISTER and
21+ * UFFDIO_WAKE ioctls should be defined as _IOW and not as _IOR. In
22+ * userfaultfd.h we assumed the kernel was reading (instead _IOC_READ
23+ * means the userland is reading).
24+ */
25+#define UFFD_API ((__u64)0xAA)
26+#define UFFD_API_REGISTER_MODES (UFFDIO_REGISTER_MODE_MISSING | \
27+ UFFDIO_REGISTER_MODE_WP | \
28+ UFFDIO_REGISTER_MODE_MINOR)
29+#define UFFD_API_FEATURES (UFFD_FEATURE_PAGEFAULT_FLAG_WP | \
30+ UFFD_FEATURE_EVENT_FORK | \
31+ UFFD_FEATURE_EVENT_REMAP | \
32+ UFFD_FEATURE_EVENT_REMOVE | \
33+ UFFD_FEATURE_EVENT_UNMAP | \
34+ UFFD_FEATURE_MISSING_HUGETLBFS | \
35+ UFFD_FEATURE_MISSING_SHMEM | \
36+ UFFD_FEATURE_SIGBUS | \
37+ UFFD_FEATURE_THREAD_ID | \
38+ UFFD_FEATURE_MINOR_HUGETLBFS | \
39+ UFFD_FEATURE_MINOR_SHMEM | \
40+ UFFD_FEATURE_EXACT_ADDRESS | \
41+ UFFD_FEATURE_WP_HUGETLBFS_SHMEM | \
42+ UFFD_FEATURE_WP_UNPOPULATED | \
43+ UFFD_FEATURE_POISON | \
44+ UFFD_FEATURE_WP_ASYNC | \
45+ UFFD_FEATURE_MOVE)
46+#define UFFD_API_IOCTLS \
47+ ((__u64)1 << _UFFDIO_REGISTER | \
48+ (__u64)1 << _UFFDIO_UNREGISTER | \
49+ (__u64)1 << _UFFDIO_API)
50+#define UFFD_API_RANGE_IOCTLS \
51+ ((__u64)1 << _UFFDIO_WAKE | \
52+ (__u64)1 << _UFFDIO_COPY | \
53+ (__u64)1 << _UFFDIO_ZEROPAGE | \
54+ (__u64)1 << _UFFDIO_MOVE | \
55+ (__u64)1 << _UFFDIO_WRITEPROTECT | \
56+ (__u64)1 << _UFFDIO_CONTINUE | \
57+ (__u64)1 << _UFFDIO_POISON)
58+#define UFFD_API_RANGE_IOCTLS_BASIC \
59+ ((__u64)1 << _UFFDIO_WAKE | \
60+ (__u64)1 << _UFFDIO_COPY | \
61+ (__u64)1 << _UFFDIO_WRITEPROTECT | \
62+ (__u64)1 << _UFFDIO_CONTINUE | \
63+ (__u64)1 << _UFFDIO_POISON)
64+
65+/*
66+ * Valid ioctl command number range with this API is from 0x00 to
67+ * 0x3F. UFFDIO_API is the fixed number, everything else can be
68+ * changed by implementing a different UFFD_API. If sticking to the
69+ * same UFFD_API more ioctl can be added and userland will be aware of
70+ * which ioctl the running kernel implements through the ioctl command
71+ * bitmask written by the UFFDIO_API.
72+ */
73+#define _UFFDIO_REGISTER (0x00)
74+#define _UFFDIO_UNREGISTER (0x01)
75+#define _UFFDIO_WAKE (0x02)
76+#define _UFFDIO_COPY (0x03)
77+#define _UFFDIO_ZEROPAGE (0x04)
78+#define _UFFDIO_MOVE (0x05)
79+#define _UFFDIO_WRITEPROTECT (0x06)
80+#define _UFFDIO_CONTINUE (0x07)
81+#define _UFFDIO_POISON (0x08)
82+#define _UFFDIO_API (0x3F)
83+
84+/* userfaultfd ioctl ids */
85+#define UFFDIO 0xAA
86+#define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \
87+ struct uffdio_api)
88+#define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \
89+ struct uffdio_register)
90+#define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \
91+ struct uffdio_range)
92+#define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \
93+ struct uffdio_range)
94+#define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \
95+ struct uffdio_copy)
96+#define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \
97+ struct uffdio_zeropage)
98+#define UFFDIO_MOVE _IOWR(UFFDIO, _UFFDIO_MOVE, \
99+ struct uffdio_move)
100+#define UFFDIO_WRITEPROTECT _IOWR(UFFDIO, _UFFDIO_WRITEPROTECT, \
101+ struct uffdio_writeprotect)
102+#define UFFDIO_CONTINUE _IOWR(UFFDIO, _UFFDIO_CONTINUE, \
103+ struct uffdio_continue)
104+#define UFFDIO_POISON _IOWR(UFFDIO, _UFFDIO_POISON, \
105+ struct uffdio_poison)
106+
107+/* read() structure */
108+struct uffd_msg {
109+ __u8 event;
110+
111+ __u8 reserved1;
112+ __u16 reserved2;
113+ __u32 reserved3;
114+
115+ union {
116+ struct {
117+ __u64 flags;
118+ __u64 address;
119+ union {
120+ __u32 ptid;
121+ } feat;
122+ } pagefault;
123+
124+ struct {
125+ __u32 ufd;
126+ } fork;
127+
128+ struct {
129+ __u64 from;
130+ __u64 to;
131+ __u64 len;
132+ } remap;
133+
134+ struct {
135+ __u64 start;
136+ __u64 end;
137+ } remove;
138+
139+ struct {
140+ /* unused reserved fields */
141+ __u64 reserved1;
142+ __u64 reserved2;
143+ __u64 reserved3;
144+ } reserved;
145+ } arg;
146+} __attribute__((packed));
147+
148+/*
149+ * Start at 0x12 and not at 0 to be more strict against bugs.
150+ */
151+#define UFFD_EVENT_PAGEFAULT 0x12
152+#define UFFD_EVENT_FORK 0x13
153+#define UFFD_EVENT_REMAP 0x14
154+#define UFFD_EVENT_REMOVE 0x15
155+#define UFFD_EVENT_UNMAP 0x16
156+
157+/* flags for UFFD_EVENT_PAGEFAULT */
158+#define UFFD_PAGEFAULT_FLAG_WRITE (1<<0) /* If this was a write fault */
159+#define UFFD_PAGEFAULT_FLAG_WP (1<<1) /* If reason is VM_UFFD_WP */
160+#define UFFD_PAGEFAULT_FLAG_MINOR (1<<2) /* If reason is VM_UFFD_MINOR */
161+
162+struct uffdio_api {
163+ /* userland asks for an API number and the features to enable */
164+ __u64 api;
165+ /*
166+ * Kernel answers below with the all available features for
167+ * the API, this notifies userland of which events and/or
168+ * which flags for each event are enabled in the current
169+ * kernel.
170+ *
171+ * Note: UFFD_EVENT_PAGEFAULT and UFFD_PAGEFAULT_FLAG_WRITE
172+ * are to be considered implicitly always enabled in all kernels as
173+ * long as the uffdio_api.api requested matches UFFD_API.
174+ *
175+ * UFFD_FEATURE_MISSING_HUGETLBFS means an UFFDIO_REGISTER
176+ * with UFFDIO_REGISTER_MODE_MISSING mode will succeed on
177+ * hugetlbfs virtual memory ranges. Adding or not adding
178+ * UFFD_FEATURE_MISSING_HUGETLBFS to uffdio_api.features has
179+ * no real functional effect after UFFDIO_API returns, but
180+ * it's only useful for an initial feature set probe at
181+ * UFFDIO_API time. There are two ways to use it:
182+ *
183+ * 1) by adding UFFD_FEATURE_MISSING_HUGETLBFS to the
184+ * uffdio_api.features before calling UFFDIO_API, an error
185+ * will be returned by UFFDIO_API on a kernel without
186+ * hugetlbfs missing support
187+ *
188+ * 2) the UFFD_FEATURE_MISSING_HUGETLBFS can not be added in
189+ * uffdio_api.features and instead it will be set by the
190+ * kernel in the uffdio_api.features if the kernel supports
191+ * it, so userland can later check if the feature flag is
192+ * present in uffdio_api.features after UFFDIO_API
193+ * succeeded.
194+ *
195+ * UFFD_FEATURE_MISSING_SHMEM works the same as
196+ * UFFD_FEATURE_MISSING_HUGETLBFS, but it applies to shmem
197+ * (i.e. tmpfs and other shmem based APIs).
198+ *
199+ * UFFD_FEATURE_SIGBUS feature means no page-fault
200+ * (UFFD_EVENT_PAGEFAULT) event will be delivered, instead
201+ * a SIGBUS signal will be sent to the faulting process.
202+ *
203+ * UFFD_FEATURE_THREAD_ID pid of the page faulted task_struct will
204+ * be returned, if feature is not requested 0 will be returned.
205+ *
206+ * UFFD_FEATURE_MINOR_HUGETLBFS indicates that minor faults
207+ * can be intercepted (via REGISTER_MODE_MINOR) for
208+ * hugetlbfs-backed pages.
209+ *
210+ * UFFD_FEATURE_MINOR_SHMEM indicates the same support as
211+ * UFFD_FEATURE_MINOR_HUGETLBFS, but for shmem-backed pages instead.
212+ *
213+ * UFFD_FEATURE_EXACT_ADDRESS indicates that the exact address of page
214+ * faults would be provided and the offset within the page would not be
215+ * masked.
216+ *
217+ * UFFD_FEATURE_WP_HUGETLBFS_SHMEM indicates that userfaultfd
218+ * write-protection mode is supported on both shmem and hugetlbfs.
219+ *
220+ * UFFD_FEATURE_WP_UNPOPULATED indicates that userfaultfd
221+ * write-protection mode will always apply to unpopulated pages
222+ * (i.e. empty ptes). This will be the default behavior for shmem
223+ * & hugetlbfs, so this flag only affects anonymous memory behavior
224+ * when userfault write-protection mode is registered.
225+ *
226+ * UFFD_FEATURE_WP_ASYNC indicates that userfaultfd write-protection
227+ * asynchronous mode is supported in which the write fault is
228+ * automatically resolved and write-protection is un-set.
229+ * It implies UFFD_FEATURE_WP_UNPOPULATED.
230+ *
231+ * UFFD_FEATURE_MOVE indicates that the kernel supports moving an
232+ * existing page contents from userspace.
233+ */
234+#define UFFD_FEATURE_PAGEFAULT_FLAG_WP (1<<0)
235+#define UFFD_FEATURE_EVENT_FORK (1<<1)
236+#define UFFD_FEATURE_EVENT_REMAP (1<<2)
237+#define UFFD_FEATURE_EVENT_REMOVE (1<<3)
238+#define UFFD_FEATURE_MISSING_HUGETLBFS (1<<4)
239+#define UFFD_FEATURE_MISSING_SHMEM (1<<5)
240+#define UFFD_FEATURE_EVENT_UNMAP (1<<6)
241+#define UFFD_FEATURE_SIGBUS (1<<7)
242+#define UFFD_FEATURE_THREAD_ID (1<<8)
243+#define UFFD_FEATURE_MINOR_HUGETLBFS (1<<9)
244+#define UFFD_FEATURE_MINOR_SHMEM (1<<10)
245+#define UFFD_FEATURE_EXACT_ADDRESS (1<<11)
246+#define UFFD_FEATURE_WP_HUGETLBFS_SHMEM (1<<12)
247+#define UFFD_FEATURE_WP_UNPOPULATED (1<<13)
248+#define UFFD_FEATURE_POISON (1<<14)
249+#define UFFD_FEATURE_WP_ASYNC (1<<15)
250+#define UFFD_FEATURE_MOVE (1<<16)
251+ __u64 features;
252+
253+ __u64 ioctls;
254+};
255+
256+struct uffdio_range {
257+ __u64 start;
258+ __u64 len;
259+};
260+
261+struct uffdio_register {
262+ struct uffdio_range range;
263+#define UFFDIO_REGISTER_MODE_MISSING ((__u64)1<<0)
264+#define UFFDIO_REGISTER_MODE_WP ((__u64)1<<1)
265+#define UFFDIO_REGISTER_MODE_MINOR ((__u64)1<<2)
266+ __u64 mode;
267+
268+ /*
269+ * kernel answers which ioctl commands are available for the
270+ * range, keep at the end as the last 8 bytes aren't read.
271+ */
272+ __u64 ioctls;
273+};
274+
275+struct uffdio_copy {
276+ __u64 dst;
277+ __u64 src;
278+ __u64 len;
279+#define UFFDIO_COPY_MODE_DONTWAKE ((__u64)1<<0)
280+ /*
281+ * UFFDIO_COPY_MODE_WP will map the page write protected on
282+ * the fly. UFFDIO_COPY_MODE_WP is available only if the
283+ * write protected ioctl is implemented for the range
284+ * according to the uffdio_register.ioctls.
285+ */
286+#define UFFDIO_COPY_MODE_WP ((__u64)1<<1)
287+ __u64 mode;
288+
289+ /*
290+ * "copy" is written by the ioctl and must be at the end: the
291+ * copy_from_user will not read the last 8 bytes.
292+ */
293+ __s64 copy;
294+};
295+
296+struct uffdio_zeropage {
297+ struct uffdio_range range;
298+#define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64)1<<0)
299+ __u64 mode;
300+
301+ /*
302+ * "zeropage" is written by the ioctl and must be at the end:
303+ * the copy_from_user will not read the last 8 bytes.
304+ */
305+ __s64 zeropage;
306+};
307+
308+struct uffdio_writeprotect {
309+ struct uffdio_range range;
310+/*
311+ * UFFDIO_WRITEPROTECT_MODE_WP: set the flag to write protect a range,
312+ * unset the flag to undo protection of a range which was previously
313+ * write protected.
314+ *
315+ * UFFDIO_WRITEPROTECT_MODE_DONTWAKE: set the flag to avoid waking up
316+ * any wait thread after the operation succeeds.
317+ *
318+ * NOTE: Write protecting a region (WP=1) is unrelated to page faults,
319+ * therefore DONTWAKE flag is meaningless with WP=1. Removing write
320+ * protection (WP=0) in response to a page fault wakes the faulting
321+ * task unless DONTWAKE is set.
322+ */
323+#define UFFDIO_WRITEPROTECT_MODE_WP ((__u64)1<<0)
324+#define UFFDIO_WRITEPROTECT_MODE_DONTWAKE ((__u64)1<<1)
325+ __u64 mode;
326+};
327+
328+struct uffdio_continue {
329+ struct uffdio_range range;
330+#define UFFDIO_CONTINUE_MODE_DONTWAKE ((__u64)1<<0)
331+ /*
332+ * UFFDIO_CONTINUE_MODE_WP will map the page write protected on
333+ * the fly. UFFDIO_CONTINUE_MODE_WP is available only if the
334+ * write protected ioctl is implemented for the range
335+ * according to the uffdio_register.ioctls.
336+ */
337+#define UFFDIO_CONTINUE_MODE_WP ((__u64)1<<1)
338+ __u64 mode;
339+
340+ /*
341+ * Fields below here are written by the ioctl and must be at the end:
342+ * the copy_from_user will not read past here.
343+ */
344+ __s64 mapped;
345+};
346+
347+struct uffdio_poison {
348+ struct uffdio_range range;
349+#define UFFDIO_POISON_MODE_DONTWAKE ((__u64)1<<0)
350+ __u64 mode;
351+
352+ /*
353+ * Fields below here are written by the ioctl and must be at the end:
354+ * the copy_from_user will not read past here.
355+ */
356+ __s64 updated;
357+};
358+
359+struct uffdio_move {
360+ __u64 dst;
361+ __u64 src;
362+ __u64 len;
363+ /*
364+ * Especially if used to atomically remove memory from the
365+ * address space the wake on the dst range is not needed.
366+ */
367+#define UFFDIO_MOVE_MODE_DONTWAKE ((__u64)1<<0)
368+#define UFFDIO_MOVE_MODE_ALLOW_SRC_HOLES ((__u64)1<<1)
369+ __u64 mode;
370+ /*
371+ * "move" is written by the ioctl and must be at the end: the
372+ * copy_from_user will not read the last 8 bytes.
373+ */
374+ __s64 move;
375+};
376+
377+/*
378+ * Flags for the userfaultfd(2) system call itself.
379+ */
380+
381+/*
382+ * Create a userfaultfd that can handle page faults only in user mode.
383+ */
384+#define UFFD_USER_MODE_ONLY 1
385+
386+#endif /* _LINUX_USERFAULTFD_H */