• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define gfpflag_string(flag) {(__force unsigned long)flag, #flag}
17 
18 #define __def_gfpflag_names			\
19 	gfpflag_string(GFP_TRANSHUGE),		\
20 	gfpflag_string(GFP_TRANSHUGE_LIGHT),	\
21 	gfpflag_string(GFP_HIGHUSER_MOVABLE),	\
22 	gfpflag_string(GFP_HIGHUSER),		\
23 	gfpflag_string(GFP_USER),		\
24 	gfpflag_string(GFP_KERNEL_ACCOUNT),	\
25 	gfpflag_string(GFP_KERNEL),		\
26 	gfpflag_string(GFP_NOFS),		\
27 	gfpflag_string(GFP_ATOMIC),		\
28 	gfpflag_string(GFP_NOIO),		\
29 	gfpflag_string(GFP_NOWAIT),		\
30 	gfpflag_string(GFP_DMA),		\
31 	gfpflag_string(__GFP_HIGHMEM),		\
32 	gfpflag_string(GFP_DMA32),		\
33 	gfpflag_string(__GFP_HIGH),		\
34 	gfpflag_string(__GFP_IO),		\
35 	gfpflag_string(__GFP_FS),		\
36 	gfpflag_string(__GFP_NOWARN),		\
37 	gfpflag_string(__GFP_RETRY_MAYFAIL),	\
38 	gfpflag_string(__GFP_NOFAIL),		\
39 	gfpflag_string(__GFP_NORETRY),		\
40 	gfpflag_string(__GFP_COMP),		\
41 	gfpflag_string(__GFP_ZERO),		\
42 	gfpflag_string(__GFP_NOMEMALLOC),	\
43 	gfpflag_string(__GFP_MEMALLOC),		\
44 	gfpflag_string(__GFP_HARDWALL),		\
45 	gfpflag_string(__GFP_THISNODE),		\
46 	gfpflag_string(__GFP_RECLAIMABLE),	\
47 	gfpflag_string(__GFP_MOVABLE),		\
48 	gfpflag_string(__GFP_ACCOUNT),		\
49 	gfpflag_string(__GFP_WRITE),		\
50 	gfpflag_string(__GFP_RECLAIM),		\
51 	gfpflag_string(__GFP_DIRECT_RECLAIM),	\
52 	gfpflag_string(__GFP_KSWAPD_RECLAIM),	\
53 	gfpflag_string(__GFP_ZEROTAGS),		\
54 	gfpflag_string(__GFP_CMA)
55 
56 #ifdef CONFIG_KASAN_HW_TAGS
57 #define __def_gfpflag_names_kasan ,			\
58 	gfpflag_string(__GFP_SKIP_ZERO),		\
59 	gfpflag_string(__GFP_SKIP_KASAN)
60 #else
61 #define __def_gfpflag_names_kasan
62 #endif
63 
64 #define show_gfp_flags(flags)						\
65 	(flags) ? __print_flags(flags, "|",				\
66 	__def_gfpflag_names __def_gfpflag_names_kasan			\
67 	) : "none"
68 
69 #ifdef CONFIG_MMU
70 #define IF_HAVE_PG_MLOCK(_name) ,{1UL << PG_##_name, __stringify(_name)}
71 #else
72 #define IF_HAVE_PG_MLOCK(_name)
73 #endif
74 
75 #ifdef CONFIG_ARCH_USES_PG_UNCACHED
76 #define IF_HAVE_PG_UNCACHED(_name) ,{1UL << PG_##_name, __stringify(_name)}
77 #else
78 #define IF_HAVE_PG_UNCACHED(_name)
79 #endif
80 
81 #ifdef CONFIG_MEMORY_FAILURE
82 #define IF_HAVE_PG_HWPOISON(_name) ,{1UL << PG_##_name, __stringify(_name)}
83 #else
84 #define IF_HAVE_PG_HWPOISON(_name)
85 #endif
86 
87 #if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT)
88 #define IF_HAVE_PG_IDLE(_name) ,{1UL << PG_##_name, __stringify(_name)}
89 #else
90 #define IF_HAVE_PG_IDLE(_name)
91 #endif
92 
93 #ifdef CONFIG_ARCH_USES_PG_ARCH_X
94 #define IF_HAVE_PG_ARCH_X(_name) ,{1UL << PG_##_name, __stringify(_name)}
95 #else
96 #define IF_HAVE_PG_ARCH_X(_name)
97 #endif
98 
99 #ifdef CONFIG_64BIT
100 #define IF_HAVE_PG_OEM_RESERVED(_name) ,{1UL << PG_##_name, __stringify(_name)}
101 #else
102 #define IF_HAVE_PG_OEM_RESERVED(_name)
103 #endif
104 
105 #define DEF_PAGEFLAG_NAME(_name) { 1UL <<  PG_##_name, __stringify(_name) }
106 
107 #define __def_pageflag_names						\
108 	DEF_PAGEFLAG_NAME(locked),					\
109 	DEF_PAGEFLAG_NAME(waiters),					\
110 	DEF_PAGEFLAG_NAME(error),					\
111 	DEF_PAGEFLAG_NAME(referenced),					\
112 	DEF_PAGEFLAG_NAME(uptodate),					\
113 	DEF_PAGEFLAG_NAME(dirty),					\
114 	DEF_PAGEFLAG_NAME(lru),						\
115 	DEF_PAGEFLAG_NAME(active),					\
116 	DEF_PAGEFLAG_NAME(workingset),					\
117 	DEF_PAGEFLAG_NAME(slab),					\
118 	DEF_PAGEFLAG_NAME(owner_priv_1),				\
119 	DEF_PAGEFLAG_NAME(arch_1),					\
120 	DEF_PAGEFLAG_NAME(reserved),					\
121 	DEF_PAGEFLAG_NAME(private),					\
122 	DEF_PAGEFLAG_NAME(private_2),					\
123 	DEF_PAGEFLAG_NAME(writeback),					\
124 	DEF_PAGEFLAG_NAME(head),					\
125 	DEF_PAGEFLAG_NAME(mappedtodisk),				\
126 	DEF_PAGEFLAG_NAME(reclaim),					\
127 	DEF_PAGEFLAG_NAME(swapbacked),					\
128 	DEF_PAGEFLAG_NAME(unevictable)					\
129 IF_HAVE_PG_MLOCK(mlocked)						\
130 IF_HAVE_PG_UNCACHED(uncached)						\
131 IF_HAVE_PG_HWPOISON(hwpoison)						\
132 IF_HAVE_PG_IDLE(idle)							\
133 IF_HAVE_PG_IDLE(young)							\
134 IF_HAVE_PG_ARCH_X(arch_2)						\
135 IF_HAVE_PG_ARCH_X(arch_3)						\
136 IF_HAVE_PG_OEM_RESERVED(oem_reserved_1)					\
137 IF_HAVE_PG_OEM_RESERVED(oem_reserved_2)					\
138 IF_HAVE_PG_OEM_RESERVED(oem_reserved_3)					\
139 IF_HAVE_PG_OEM_RESERVED(oem_reserved_4)
140 
141 #define show_page_flags(flags)						\
142 	(flags) ? __print_flags(flags, "|",				\
143 	__def_pageflag_names						\
144 	) : "none"
145 
146 #define DEF_PAGETYPE_NAME(_name) { PG_##_name, __stringify(_name) }
147 
148 #define __def_pagetype_names						\
149 	DEF_PAGETYPE_NAME(hugetlb),					\
150 	DEF_PAGETYPE_NAME(offline),					\
151 	DEF_PAGETYPE_NAME(guard),					\
152 	DEF_PAGETYPE_NAME(table),					\
153 	DEF_PAGETYPE_NAME(buddy)
154 
155 #if defined(CONFIG_X86)
156 #define __VM_ARCH_SPECIFIC_1 {VM_PAT,     "pat"           }
157 #elif defined(CONFIG_PPC)
158 #define __VM_ARCH_SPECIFIC_1 {VM_SAO,     "sao"           }
159 #elif defined(CONFIG_PARISC) || defined(CONFIG_IA64)
160 #define __VM_ARCH_SPECIFIC_1 {VM_GROWSUP,	"growsup"	}
161 #elif !defined(CONFIG_MMU)
162 #define __VM_ARCH_SPECIFIC_1 {VM_MAPPED_COPY,"mappedcopy"	}
163 #else
164 #define __VM_ARCH_SPECIFIC_1 {VM_ARCH_1,	"arch_1"	}
165 #endif
166 
167 #ifdef CONFIG_MEM_SOFT_DIRTY
168 #define IF_HAVE_VM_SOFTDIRTY(flag,name) {flag, name },
169 #else
170 #define IF_HAVE_VM_SOFTDIRTY(flag,name)
171 #endif
172 
173 #ifdef CONFIG_HAVE_ARCH_USERFAULTFD_MINOR
174 # define IF_HAVE_UFFD_MINOR(flag, name) {flag, name},
175 #else
176 # define IF_HAVE_UFFD_MINOR(flag, name)
177 #endif
178 
179 #define __def_vmaflag_names						\
180 	{VM_READ,			"read"		},		\
181 	{VM_WRITE,			"write"		},		\
182 	{VM_EXEC,			"exec"		},		\
183 	{VM_SHARED,			"shared"	},		\
184 	{VM_MAYREAD,			"mayread"	},		\
185 	{VM_MAYWRITE,			"maywrite"	},		\
186 	{VM_MAYEXEC,			"mayexec"	},		\
187 	{VM_MAYSHARE,			"mayshare"	},		\
188 	{VM_GROWSDOWN,			"growsdown"	},		\
189 	{VM_UFFD_MISSING,		"uffd_missing"	},		\
190 IF_HAVE_UFFD_MINOR(VM_UFFD_MINOR,	"uffd_minor"	)		\
191 	{VM_PFNMAP,			"pfnmap"	},		\
192 	{VM_UFFD_WP,			"uffd_wp"	},		\
193 	{VM_LOCKED,			"locked"	},		\
194 	{VM_IO,				"io"		},		\
195 	{VM_SEQ_READ,			"seqread"	},		\
196 	{VM_RAND_READ,			"randread"	},		\
197 	{VM_DONTCOPY,			"dontcopy"	},		\
198 	{VM_DONTEXPAND,			"dontexpand"	},		\
199 	{VM_LOCKONFAULT,		"lockonfault"	},		\
200 	{VM_ACCOUNT,			"account"	},		\
201 	{VM_NORESERVE,			"noreserve"	},		\
202 	{VM_HUGETLB,			"hugetlb"	},		\
203 	{VM_SYNC,			"sync"		},		\
204 	__VM_ARCH_SPECIFIC_1				,		\
205 	{VM_WIPEONFORK,			"wipeonfork"	},		\
206 	{VM_DONTDUMP,			"dontdump"	},		\
207 IF_HAVE_VM_SOFTDIRTY(VM_SOFTDIRTY,	"softdirty"	)		\
208 	{VM_MIXEDMAP,			"mixedmap"	},		\
209 	{VM_HUGEPAGE,			"hugepage"	},		\
210 	{VM_NOHUGEPAGE,			"nohugepage"	},		\
211 	{VM_MERGEABLE,			"mergeable"	}		\
212 
213 #define show_vma_flags(flags)						\
214 	(flags) ? __print_flags(flags, "|",				\
215 	__def_vmaflag_names						\
216 	) : "none"
217 
218 #ifdef CONFIG_COMPACTION
219 #define COMPACTION_STATUS					\
220 	EM( COMPACT_SKIPPED,		"skipped")		\
221 	EM( COMPACT_DEFERRED,		"deferred")		\
222 	EM( COMPACT_CONTINUE,		"continue")		\
223 	EM( COMPACT_SUCCESS,		"success")		\
224 	EM( COMPACT_PARTIAL_SKIPPED,	"partial_skipped")	\
225 	EM( COMPACT_COMPLETE,		"complete")		\
226 	EM( COMPACT_NO_SUITABLE_PAGE,	"no_suitable_page")	\
227 	EM( COMPACT_NOT_SUITABLE_ZONE,	"not_suitable_zone")	\
228 	EMe(COMPACT_CONTENDED,		"contended")
229 
230 /* High-level compaction status feedback */
231 #define COMPACTION_FAILED	1
232 #define COMPACTION_WITHDRAWN	2
233 #define COMPACTION_PROGRESS	3
234 
235 #define compact_result_to_feedback(result)	\
236 ({						\
237 	enum compact_result __result = result;	\
238 	(__result == COMPACT_COMPLETE) ? COMPACTION_FAILED : \
239 		(__result == COMPACT_SUCCESS) ? COMPACTION_PROGRESS : COMPACTION_WITHDRAWN; \
240 })
241 
242 #define COMPACTION_FEEDBACK		\
243 	EM(COMPACTION_FAILED,		"failed")	\
244 	EM(COMPACTION_WITHDRAWN,	"withdrawn")	\
245 	EMe(COMPACTION_PROGRESS,	"progress")
246 
247 #define COMPACTION_PRIORITY						\
248 	EM(COMPACT_PRIO_SYNC_FULL,	"COMPACT_PRIO_SYNC_FULL")	\
249 	EM(COMPACT_PRIO_SYNC_LIGHT,	"COMPACT_PRIO_SYNC_LIGHT")	\
250 	EMe(COMPACT_PRIO_ASYNC,		"COMPACT_PRIO_ASYNC")
251 #else
252 #define COMPACTION_STATUS
253 #define COMPACTION_PRIORITY
254 #define COMPACTION_FEEDBACK
255 #endif
256 
257 #ifdef CONFIG_ZONE_DMA
258 #define IFDEF_ZONE_DMA(X) X
259 #else
260 #define IFDEF_ZONE_DMA(X)
261 #endif
262 
263 #ifdef CONFIG_ZONE_DMA32
264 #define IFDEF_ZONE_DMA32(X) X
265 #else
266 #define IFDEF_ZONE_DMA32(X)
267 #endif
268 
269 #ifdef CONFIG_HIGHMEM
270 #define IFDEF_ZONE_HIGHMEM(X) X
271 #else
272 #define IFDEF_ZONE_HIGHMEM(X)
273 #endif
274 
275 #define ZONE_TYPE						\
276 	IFDEF_ZONE_DMA(		EM (ZONE_DMA,	 "DMA"))	\
277 	IFDEF_ZONE_DMA32(	EM (ZONE_DMA32,	 "DMA32"))	\
278 				EM (ZONE_NORMAL, "Normal")	\
279 	IFDEF_ZONE_HIGHMEM(	EM (ZONE_HIGHMEM,"HighMem"))	\
280 				EM (ZONE_MOVABLE,"Movable")	\
281 				EM (ZONE_NOSPLIT,"NoSplit")	\
282 				EMe(ZONE_NOMERGE,"NoMerge")
283 
284 #define LRU_NAMES		\
285 		EM (LRU_INACTIVE_ANON, "inactive_anon") \
286 		EM (LRU_ACTIVE_ANON, "active_anon") \
287 		EM (LRU_INACTIVE_FILE, "inactive_file") \
288 		EM (LRU_ACTIVE_FILE, "active_file") \
289 		EMe(LRU_UNEVICTABLE, "unevictable")
290 
291 /*
292  * First define the enums in the above macros to be exported to userspace
293  * via TRACE_DEFINE_ENUM().
294  */
295 #undef EM
296 #undef EMe
297 #define EM(a, b)	TRACE_DEFINE_ENUM(a);
298 #define EMe(a, b)	TRACE_DEFINE_ENUM(a);
299 
300 COMPACTION_STATUS
301 COMPACTION_PRIORITY
302 /* COMPACTION_FEEDBACK are defines not enums. Not needed here. */
303 ZONE_TYPE
304 LRU_NAMES
305 
306 /*
307  * Now redefine the EM() and EMe() macros to map the enums to the strings
308  * that will be printed in the output.
309  */
310 #undef EM
311 #undef EMe
312 #define EM(a, b)	{a, b},
313 #define EMe(a, b)	{a, b}
314