projects/linux·blob master · refs

336 lines · 9.2 KiB

1/* SPDX-License-Identifier: GPL-2.0 */
2#include <linux/node.h>
3#include <linux/mmzone.h>
4#include <linux/compaction.h>
5/*
6 * The order of these masks is important. Matching masks will be seen
7 * first and the left over flags will end up showing by themselves.
8 *
9 * For example, if we have GFP_KERNEL before GFP_USER we wil get:
10 *
11 * GFP_KERNEL|GFP_HARDWALL
12 *
13 * Thus most bits set go first.
14 */
15
16/* These define the values that are enums (the bits) */
17#define TRACE_GFP_FLAGS_GENERAL \
18 TRACE_GFP_EM(DMA) \
19 TRACE_GFP_EM(HIGHMEM) \
20 TRACE_GFP_EM(DMA32) \
21 TRACE_GFP_EM(MOVABLE) \
22 TRACE_GFP_EM(RECLAIMABLE) \
23 TRACE_GFP_EM(HIGH) \
24 TRACE_GFP_EM(IO) \
25 TRACE_GFP_EM(FS) \
26 TRACE_GFP_EM(ZERO) \
27 TRACE_GFP_EM(DIRECT_RECLAIM) \
28 TRACE_GFP_EM(KSWAPD_RECLAIM) \
29 TRACE_GFP_EM(WRITE) \
30 TRACE_GFP_EM(NOWARN) \
31 TRACE_GFP_EM(RETRY_MAYFAIL) \
32 TRACE_GFP_EM(NOFAIL) \
33 TRACE_GFP_EM(NORETRY) \
34 TRACE_GFP_EM(MEMALLOC) \
35 TRACE_GFP_EM(COMP) \
36 TRACE_GFP_EM(NOMEMALLOC) \
37 TRACE_GFP_EM(HARDWALL) \
38 TRACE_GFP_EM(THISNODE) \
39 TRACE_GFP_EM(ACCOUNT) \
40 TRACE_GFP_EM(ZEROTAGS)
41
42#ifdef CONFIG_KASAN_HW_TAGS
43# define TRACE_GFP_FLAGS_KASAN \
44 TRACE_GFP_EM(SKIP_ZERO) \
45 TRACE_GFP_EM(SKIP_KASAN)
46#else
47# define TRACE_GFP_FLAGS_KASAN
48#endif
49
50#ifdef CONFIG_LOCKDEP
51# define TRACE_GFP_FLAGS_LOCKDEP \
52 TRACE_GFP_EM(NOLOCKDEP)
53#else
54# define TRACE_GFP_FLAGS_LOCKDEP
55#endif
56
57#define TRACE_GFP_FLAGS \
58 TRACE_GFP_FLAGS_GENERAL \
59 TRACE_GFP_FLAGS_KASAN \
60 TRACE_GFP_FLAGS_LOCKDEP
61
62#undef TRACE_GFP_EM
63#define TRACE_GFP_EM(a) TRACE_DEFINE_ENUM(___GFP_##a##_BIT);
64
65TRACE_GFP_FLAGS
66
67/* Just in case these are ever used */
68TRACE_DEFINE_ENUM(___GFP_UNUSED_BIT);
69TRACE_DEFINE_ENUM(___GFP_LAST_BIT);
70
71#define gfpflag_string(flag) {(__force unsigned long)flag, #flag}
72
73/*
74 * For the values that match the bits, use the TRACE_GFP_FLAGS
75 * which will allow any updates to be included automatically.
76 */
77#undef TRACE_GFP_EM
78#define TRACE_GFP_EM(a) gfpflag_string(__GFP_##a),
79
80#define __def_gfpflag_names \
81 gfpflag_string(GFP_TRANSHUGE), \
82 gfpflag_string(GFP_TRANSHUGE_LIGHT), \
83 gfpflag_string(GFP_HIGHUSER_MOVABLE), \
84 gfpflag_string(GFP_HIGHUSER), \
85 gfpflag_string(GFP_USER), \
86 gfpflag_string(GFP_KERNEL_ACCOUNT), \
87 gfpflag_string(GFP_KERNEL), \
88 gfpflag_string(GFP_NOFS), \
89 gfpflag_string(GFP_ATOMIC), \
90 gfpflag_string(GFP_NOIO), \
91 gfpflag_string(GFP_NOWAIT), \
92 gfpflag_string(GFP_DMA), \
93 gfpflag_string(GFP_DMA32), \
94 gfpflag_string(__GFP_RECLAIM), \
95 TRACE_GFP_FLAGS \
96 { 0, NULL }
97
98#define show_gfp_flags(flags) \
99 (flags) ? __print_flags(flags, "|", __def_gfpflag_names \
100 ) : "none"
101
102#ifdef CONFIG_MMU
103#define IF_HAVE_PG_MLOCK(_name) ,{1UL << PG_##_name, __stringify(_name)}
104#else
105#define IF_HAVE_PG_MLOCK(_name)
106#endif
107
108#ifdef CONFIG_MEMORY_FAILURE
109#define IF_HAVE_PG_HWPOISON(_name) ,{1UL << PG_##_name, __stringify(_name)}
110#else
111#define IF_HAVE_PG_HWPOISON(_name)
112#endif
113
114#if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT)
115#define IF_HAVE_PG_IDLE(_name) ,{1UL << PG_##_name, __stringify(_name)}
116#else
117#define IF_HAVE_PG_IDLE(_name)
118#endif
119
120#ifdef CONFIG_ARCH_USES_PG_ARCH_2
121#define IF_HAVE_PG_ARCH_2(_name) ,{1UL << PG_##_name, __stringify(_name)}
122#else
123#define IF_HAVE_PG_ARCH_2(_name)
124#endif
125
126#ifdef CONFIG_ARCH_USES_PG_ARCH_3
127#define IF_HAVE_PG_ARCH_3(_name) ,{1UL << PG_##_name, __stringify(_name)}
128#else
129#define IF_HAVE_PG_ARCH_3(_name)
130#endif
131
132#define DEF_PAGEFLAG_NAME(_name) { 1UL << PG_##_name, __stringify(_name) }
133
134#define __def_pageflag_names \
135 DEF_PAGEFLAG_NAME(locked), \
136 DEF_PAGEFLAG_NAME(waiters), \
137 DEF_PAGEFLAG_NAME(referenced), \
138 DEF_PAGEFLAG_NAME(uptodate), \
139 DEF_PAGEFLAG_NAME(dirty), \
140 DEF_PAGEFLAG_NAME(lru), \
141 DEF_PAGEFLAG_NAME(active), \
142 DEF_PAGEFLAG_NAME(workingset), \
143 DEF_PAGEFLAG_NAME(owner_priv_1), \
144 DEF_PAGEFLAG_NAME(owner_2), \
145 DEF_PAGEFLAG_NAME(arch_1), \
146 DEF_PAGEFLAG_NAME(reserved), \
147 DEF_PAGEFLAG_NAME(private), \
148 DEF_PAGEFLAG_NAME(private_2), \
149 DEF_PAGEFLAG_NAME(writeback), \
150 DEF_PAGEFLAG_NAME(head), \
151 DEF_PAGEFLAG_NAME(reclaim), \
152 DEF_PAGEFLAG_NAME(swapbacked), \
153 DEF_PAGEFLAG_NAME(unevictable), \
154 DEF_PAGEFLAG_NAME(dropbehind) \
155IF_HAVE_PG_MLOCK(mlocked) \
156IF_HAVE_PG_HWPOISON(hwpoison) \
157IF_HAVE_PG_IDLE(idle) \
158IF_HAVE_PG_IDLE(young) \
159IF_HAVE_PG_ARCH_2(arch_2) \
160IF_HAVE_PG_ARCH_3(arch_3)
161
162#define show_page_flags(flags) \
163 (flags) ? __print_flags(flags, "|", \
164 __def_pageflag_names \
165 ) : "none"
166
167#if defined(CONFIG_PPC64)
168#define __VM_ARCH_SPECIFIC_1 {VM_SAO, "sao" }
169#elif defined(CONFIG_PARISC)
170#define __VM_ARCH_SPECIFIC_1 {VM_GROWSUP, "growsup" }
171#elif !defined(CONFIG_MMU)
172#define __VM_ARCH_SPECIFIC_1 {VM_MAPPED_COPY,"mappedcopy" }
173#else
174#define __VM_ARCH_SPECIFIC_1 {VM_ARCH_1, "arch_1" }
175#endif
176
177#ifdef CONFIG_MEM_SOFT_DIRTY
178#define IF_HAVE_VM_SOFTDIRTY(flag,name) {flag, name },
179#else
180#define IF_HAVE_VM_SOFTDIRTY(flag,name)
181#endif
182
183#ifdef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
184# define IF_HAVE_UFFD_MINOR(flag, name) {flag, name},
185#else
186# define IF_HAVE_UFFD_MINOR(flag, name)
187#endif
188
189#ifdef CONFIG_USERFAULTFD_RWP
190# define IF_HAVE_UFFD_RWP(flag, name) {flag, name},
191#else
192# define IF_HAVE_UFFD_RWP(flag, name)
193#endif
194
195#if defined(CONFIG_64BIT) || defined(CONFIG_PPC32)
196# define IF_HAVE_VM_DROPPABLE(flag, name) {flag, name},
197#else
198# define IF_HAVE_VM_DROPPABLE(flag, name)
199#endif
200
201#define __def_vmaflag_names \
202 {VM_READ, "read" }, \
203 {VM_WRITE, "write" }, \
204 {VM_EXEC, "exec" }, \
205 {VM_SHARED, "shared" }, \
206 {VM_MAYREAD, "mayread" }, \
207 {VM_MAYWRITE, "maywrite" }, \
208 {VM_MAYEXEC, "mayexec" }, \
209 {VM_MAYSHARE, "mayshare" }, \
210 {VM_GROWSDOWN, "growsdown" }, \
211 {VM_UFFD_MISSING, "uffd_missing" }, \
212IF_HAVE_UFFD_MINOR(VM_UFFD_MINOR, "uffd_minor" ) \
213 {VM_PFNMAP, "pfnmap" }, \
214 {VM_MAYBE_GUARD, "maybe_guard" }, \
215 {VM_UFFD_WP, "uffd_wp" }, \
216IF_HAVE_UFFD_RWP(VM_UFFD_RWP, "uffd_rwp" ) \
217 {VM_LOCKED, "locked" }, \
218 {VM_IO, "io" }, \
219 {VM_SEQ_READ, "seqread" }, \
220 {VM_RAND_READ, "randread" }, \
221 {VM_DONTCOPY, "dontcopy" }, \
222 {VM_DONTEXPAND, "dontexpand" }, \
223 {VM_LOCKONFAULT, "lockonfault" }, \
224 {VM_ACCOUNT, "account" }, \
225 {VM_NORESERVE, "noreserve" }, \
226 {VM_HUGETLB, "hugetlb" }, \
227 {VM_SYNC, "sync" }, \
228 __VM_ARCH_SPECIFIC_1 , \
229 {VM_WIPEONFORK, "wipeonfork" }, \
230 {VM_DONTDUMP, "dontdump" }, \
231IF_HAVE_VM_SOFTDIRTY(VM_SOFTDIRTY, "softdirty" ) \
232 {VM_MIXEDMAP, "mixedmap" }, \
233 {VM_HUGEPAGE, "hugepage" }, \
234 {VM_NOHUGEPAGE, "nohugepage" }, \
235IF_HAVE_VM_DROPPABLE(VM_DROPPABLE, "droppable" ) \
236 {VM_MERGEABLE, "mergeable" } \
237
238#define show_vma_flags(flags) \
239 (flags) ? __print_flags(flags, "|", \
240 __def_vmaflag_names \
241 ) : "none"
242
243#ifdef CONFIG_COMPACTION
244#define COMPACTION_STATUS \
245 EM( COMPACT_SKIPPED, "skipped") \
246 EM( COMPACT_DEFERRED, "deferred") \
247 EM( COMPACT_CONTINUE, "continue") \
248 EM( COMPACT_SUCCESS, "success") \
249 EM( COMPACT_PARTIAL_SKIPPED, "partial_skipped") \
250 EM( COMPACT_COMPLETE, "complete") \
251 EM( COMPACT_NO_SUITABLE_PAGE, "no_suitable_page") \
252 EM( COMPACT_NOT_SUITABLE_ZONE, "not_suitable_zone") \
253 EMe(COMPACT_CONTENDED, "contended")
254
255/* High-level compaction status feedback */
256#define COMPACTION_FAILED 1
257#define COMPACTION_WITHDRAWN 2
258#define COMPACTION_PROGRESS 3
259
260#define compact_result_to_feedback(result) \
261({ \
262 enum compact_result __result = result; \
263 (__result == COMPACT_COMPLETE) ? COMPACTION_FAILED : \
264 (__result == COMPACT_SUCCESS) ? COMPACTION_PROGRESS : COMPACTION_WITHDRAWN; \
265})
266
267#define COMPACTION_FEEDBACK \
268 EM(COMPACTION_FAILED, "failed") \
269 EM(COMPACTION_WITHDRAWN, "withdrawn") \
270 EMe(COMPACTION_PROGRESS, "progress")
271
272#define COMPACTION_PRIORITY \
273 EM(COMPACT_PRIO_SYNC_FULL, "COMPACT_PRIO_SYNC_FULL") \
274 EM(COMPACT_PRIO_SYNC_LIGHT, "COMPACT_PRIO_SYNC_LIGHT") \
275 EMe(COMPACT_PRIO_ASYNC, "COMPACT_PRIO_ASYNC")
276#else
277#define COMPACTION_STATUS
278#define COMPACTION_PRIORITY
279#define COMPACTION_FEEDBACK
280#endif
281
282#ifdef CONFIG_ZONE_DMA
283#define IFDEF_ZONE_DMA(X) X
284#else
285#define IFDEF_ZONE_DMA(X)
286#endif
287
288#ifdef CONFIG_ZONE_DMA32
289#define IFDEF_ZONE_DMA32(X) X
290#else
291#define IFDEF_ZONE_DMA32(X)
292#endif
293
294#ifdef CONFIG_HIGHMEM
295#define IFDEF_ZONE_HIGHMEM(X) X
296#else
297#define IFDEF_ZONE_HIGHMEM(X)
298#endif
299
300#define ZONE_TYPE \
301 IFDEF_ZONE_DMA( EM (ZONE_DMA, "DMA")) \
302 IFDEF_ZONE_DMA32( EM (ZONE_DMA32, "DMA32")) \
303 EM (ZONE_NORMAL, "Normal") \
304 IFDEF_ZONE_HIGHMEM( EM (ZONE_HIGHMEM,"HighMem")) \
305 EMe(ZONE_MOVABLE,"Movable")
306
307#define LRU_NAMES \
308 EM (LRU_INACTIVE_ANON, "inactive_anon") \
309 EM (LRU_ACTIVE_ANON, "active_anon") \
310 EM (LRU_INACTIVE_FILE, "inactive_file") \
311 EM (LRU_ACTIVE_FILE, "active_file") \
312 EMe(LRU_UNEVICTABLE, "unevictable")
313
314/*
315 * First define the enums in the above macros to be exported to userspace
316 * via TRACE_DEFINE_ENUM().
317 */
318#undef EM
319#undef EMe
320#define EM(a, b) TRACE_DEFINE_ENUM(a);
321#define EMe(a, b) TRACE_DEFINE_ENUM(a);
322
323COMPACTION_STATUS
324COMPACTION_PRIORITY
325/* COMPACTION_FEEDBACK are defines not enums. Not needed here. */
326ZONE_TYPE
327LRU_NAMES
328
329/*
330 * Now redefine the EM() and EMe() macros to map the enums to the strings
331 * that will be printed in the output.
332 */
333#undef EM
334#undef EMe
335#define EM(a, b) {a, b},
336#define EMe(a, b) {a, b}