xref: /linux/include/trace/events/vmscan.h (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM vmscan
4 
5 #if !defined(_TRACE_VMSCAN_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_VMSCAN_H
7 
8 #include <linux/types.h>
9 #include <linux/tracepoint.h>
10 #include <linux/mm.h>
11 #include <linux/memcontrol.h>
12 #include <trace/events/mmflags.h>
13 
14 #define RECLAIM_WB_ANON		0x0001u
15 #define RECLAIM_WB_FILE		0x0002u
16 #define RECLAIM_WB_MIXED	0x0010u
17 #define RECLAIM_WB_SYNC		0x0004u /* Unused, all reclaim async */
18 #define RECLAIM_WB_ASYNC	0x0008u
19 #define RECLAIM_WB_LRU		(RECLAIM_WB_ANON|RECLAIM_WB_FILE)
20 
21 #define show_reclaim_flags(flags)				\
22 	(flags) ? __print_flags(flags, "|",			\
23 		{RECLAIM_WB_ANON,	"RECLAIM_WB_ANON"},	\
24 		{RECLAIM_WB_FILE,	"RECLAIM_WB_FILE"},	\
25 		{RECLAIM_WB_MIXED,	"RECLAIM_WB_MIXED"},	\
26 		{RECLAIM_WB_SYNC,	"RECLAIM_WB_SYNC"},	\
27 		{RECLAIM_WB_ASYNC,	"RECLAIM_WB_ASYNC"}	\
28 		) : "RECLAIM_WB_NONE"
29 
30 #define _VMSCAN_THROTTLE_WRITEBACK	(1 << VMSCAN_THROTTLE_WRITEBACK)
31 #define _VMSCAN_THROTTLE_ISOLATED	(1 << VMSCAN_THROTTLE_ISOLATED)
32 #define _VMSCAN_THROTTLE_NOPROGRESS	(1 << VMSCAN_THROTTLE_NOPROGRESS)
33 #define _VMSCAN_THROTTLE_CONGESTED	(1 << VMSCAN_THROTTLE_CONGESTED)
34 
35 #define show_throttle_flags(flags)						\
36 	(flags) ? __print_flags(flags, "|",					\
37 		{_VMSCAN_THROTTLE_WRITEBACK,	"VMSCAN_THROTTLE_WRITEBACK"},	\
38 		{_VMSCAN_THROTTLE_ISOLATED,	"VMSCAN_THROTTLE_ISOLATED"},	\
39 		{_VMSCAN_THROTTLE_NOPROGRESS,	"VMSCAN_THROTTLE_NOPROGRESS"},	\
40 		{_VMSCAN_THROTTLE_CONGESTED,	"VMSCAN_THROTTLE_CONGESTED"}	\
41 		) : "VMSCAN_THROTTLE_NONE"
42 
43 TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_OTHER);
44 TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_KSWAPD);
45 TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_DIRECT);
46 TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_PCP);
47 
48 #define kswapd_clear_hopeless_reason_ops		\
49 	{KSWAPD_CLEAR_HOPELESS_KSWAPD,	"KSWAPD"},	\
50 	{KSWAPD_CLEAR_HOPELESS_DIRECT,	"DIRECT"},	\
51 	{KSWAPD_CLEAR_HOPELESS_PCP,	"PCP"},		\
52 	{KSWAPD_CLEAR_HOPELESS_OTHER,	"OTHER"}
53 
54 #define trace_reclaim_flags(file) ( \
55 	(file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
56 	(RECLAIM_WB_ASYNC) \
57 	)
58 
59 TRACE_EVENT(mm_vmscan_kswapd_sleep,
60 
61 	TP_PROTO(int nid),
62 
63 	TP_ARGS(nid),
64 
65 	TP_STRUCT__entry(
66 		__field(	int,	nid	)
67 	),
68 
69 	TP_fast_assign(
70 		__entry->nid	= nid;
71 	),
72 
73 	TP_printk("nid=%d", __entry->nid)
74 );
75 
76 TRACE_EVENT(mm_vmscan_kswapd_wake,
77 
78 	TP_PROTO(int nid, int zid, int order),
79 
80 	TP_ARGS(nid, zid, order),
81 
82 	TP_STRUCT__entry(
83 		__field(	int,	nid	)
84 		__field(	int,	zid	)
85 		__field(	int,	order	)
86 	),
87 
88 	TP_fast_assign(
89 		__entry->nid	= nid;
90 		__entry->zid    = zid;
91 		__entry->order	= order;
92 	),
93 
94 	TP_printk("nid=%d order=%d",
95 		__entry->nid,
96 		__entry->order)
97 );
98 
99 TRACE_EVENT(mm_vmscan_balance_pgdat_begin,
100 
101 	TP_PROTO(int nid, int order, int highest_zoneidx),
102 
103 	TP_ARGS(nid, order, highest_zoneidx),
104 
105 	TP_STRUCT__entry(
106 		__field(int, nid)
107 		__field(int, order)
108 		__field(int, highest_zoneidx)
109 	),
110 
111 	TP_fast_assign(
112 		__entry->nid = nid;
113 		__entry->order = order;
114 		__entry->highest_zoneidx = highest_zoneidx;
115 	),
116 
117 	TP_printk("nid=%d order=%d highest_zoneidx=%-8s",
118 		__entry->nid,
119 		__entry->order,
120 		__print_symbolic(__entry->highest_zoneidx, ZONE_TYPE))
121 );
122 
123 TRACE_EVENT(mm_vmscan_balance_pgdat_end,
124 
125 	TP_PROTO(int nid, int order, int highest_zoneidx,
126 		 unsigned long nr_reclaimed),
127 
128 	TP_ARGS(nid, order, highest_zoneidx, nr_reclaimed),
129 
130 	TP_STRUCT__entry(
131 		__field(int, nid)
132 		__field(int, order)
133 		__field(int, highest_zoneidx)
134 		__field(unsigned long, nr_reclaimed)
135 	),
136 
137 	TP_fast_assign(
138 		__entry->nid = nid;
139 		__entry->order = order;
140 		__entry->highest_zoneidx = highest_zoneidx;
141 		__entry->nr_reclaimed = nr_reclaimed;
142 	),
143 
144 	TP_printk("nid=%d order=%d highest_zoneidx=%-8s nr_reclaimed=%lu",
145 		__entry->nid,
146 		__entry->order,
147 		__print_symbolic(__entry->highest_zoneidx, ZONE_TYPE),
148 		__entry->nr_reclaimed)
149 );
150 
151 TRACE_EVENT(mm_vmscan_wakeup_kswapd,
152 
153 	TP_PROTO(int nid, int zid, int order, gfp_t gfp_flags),
154 
155 	TP_ARGS(nid, zid, order, gfp_flags),
156 
157 	TP_STRUCT__entry(
158 		__field(	int,	nid		)
159 		__field(	int,	zid		)
160 		__field(	int,	order		)
161 		__field(	unsigned long,	gfp_flags	)
162 	),
163 
164 	TP_fast_assign(
165 		__entry->nid		= nid;
166 		__entry->zid		= zid;
167 		__entry->order		= order;
168 		__entry->gfp_flags	= (__force unsigned long)gfp_flags;
169 	),
170 
171 	TP_printk("nid=%d order=%d gfp_flags=%s",
172 		__entry->nid,
173 		__entry->order,
174 		show_gfp_flags(__entry->gfp_flags))
175 );
176 
177 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
178 
179 	TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
180 
181 	TP_ARGS(gfp_flags, order, memcg),
182 
183 	TP_STRUCT__entry(
184 		__field(	unsigned long,	gfp_flags	)
185 		__field(	u64,	memcg_id	)
186 		__field(	int,	order		)
187 	),
188 
189 	TP_fast_assign(
190 		__entry->gfp_flags	= (__force unsigned long)gfp_flags;
191 		__entry->order		= order;
192 		__entry->memcg_id	= mem_cgroup_id(memcg);
193 	),
194 
195 	TP_printk("order=%d gfp_flags=%s pid=%d memcg_id=%llu %s",
196 		__entry->order,
197 		show_gfp_flags(__entry->gfp_flags),
198 		__entry->ent.pid,
199 		__entry->memcg_id,
200 		__event_in_irq() ? "(in-irq)" : "")
201 );
202 
203 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin,
204 
205 	TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
206 
207 	TP_ARGS(gfp_flags, order, memcg)
208 );
209 
210 #ifdef CONFIG_MEMCG
211 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin,
212 
213 	TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
214 
215 	TP_ARGS(gfp_flags, order, memcg)
216 );
217 
218 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin,
219 
220 	TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
221 
222 	TP_ARGS(gfp_flags, order, memcg)
223 );
224 #endif /* CONFIG_MEMCG */
225 
226 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template,
227 
228 	TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg),
229 
230 	TP_ARGS(nr_reclaimed, memcg),
231 
232 	TP_STRUCT__entry(
233 		__field(	unsigned long,	nr_reclaimed	)
234 		__field(	u64,	memcg_id	)
235 	),
236 
237 	TP_fast_assign(
238 		__entry->nr_reclaimed	= nr_reclaimed;
239 		__entry->memcg_id	= mem_cgroup_id(memcg);
240 	),
241 
242 	TP_printk("nr_reclaimed=%lu pid=%d memcg_id=%llu %s",
243 		__entry->nr_reclaimed,
244 		__entry->ent.pid,
245 		__entry->memcg_id,
246 		__event_in_irq() ? "(in-irq)" : "")
247 );
248 
249 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end,
250 
251 	TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg),
252 
253 	TP_ARGS(nr_reclaimed, memcg)
254 );
255 
256 #ifdef CONFIG_MEMCG
257 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end,
258 
259 	TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg),
260 
261 	TP_ARGS(nr_reclaimed, memcg)
262 );
263 
264 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end,
265 
266 	TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg),
267 
268 	TP_ARGS(nr_reclaimed, memcg)
269 );
270 #endif /* CONFIG_MEMCG */
271 
272 TRACE_EVENT(mm_shrink_slab_start,
273 	TP_PROTO(struct shrinker *shr, struct shrink_control *sc,
274 		long nr_objects_to_shrink, unsigned long cache_items,
275 		unsigned long long delta, unsigned long total_scan,
276 		int priority, struct mem_cgroup *memcg),
277 
278 	TP_ARGS(shr, sc, nr_objects_to_shrink, cache_items, delta, total_scan,
279 		priority, memcg),
280 
281 	TP_STRUCT__entry(
282 		__field(struct shrinker *, shr)
283 		__field(void *, shrink)
284 		__field(long, nr_objects_to_shrink)
285 		__field(unsigned long, gfp_flags)
286 		__field(unsigned long, cache_items)
287 		__field(unsigned long long, delta)
288 		__field(unsigned long, total_scan)
289 		__field(int, priority)
290 		__field(int, nid)
291 		__field(u64, memcg_id)
292 	),
293 
294 	TP_fast_assign(
295 		__entry->shr = shr;
296 		__entry->shrink = shr->scan_objects;
297 		__entry->nr_objects_to_shrink = nr_objects_to_shrink;
298 		__entry->gfp_flags = (__force unsigned long)sc->gfp_mask;
299 		__entry->cache_items = cache_items;
300 		__entry->delta = delta;
301 		__entry->total_scan = total_scan;
302 		__entry->priority = priority;
303 		__entry->nid = sc->nid;
304 		__entry->memcg_id = mem_cgroup_id(memcg);
305 	),
306 
307 	TP_printk("%pS %p: nid: %d pid: %d memcg_id: %llu objects to shrink %ld gfp_flags %s cache items %ld delta %lld total_scan %ld priority %d %s",
308 		__entry->shrink,
309 		__entry->shr,
310 		__entry->nid,
311 		__entry->ent.pid,
312 		__entry->memcg_id,
313 		__entry->nr_objects_to_shrink,
314 		show_gfp_flags(__entry->gfp_flags),
315 		__entry->cache_items,
316 		__entry->delta,
317 		__entry->total_scan,
318 		__entry->priority,
319 		__event_in_irq() ? "(in-irq)" : "")
320 );
321 
322 TRACE_EVENT(mm_shrink_slab_end,
323 	TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval,
324 		long unused_scan_cnt, long new_scan_cnt, long total_scan, struct mem_cgroup *memcg),
325 
326 	TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt,
327 		total_scan, memcg),
328 
329 	TP_STRUCT__entry(
330 		__field(struct shrinker *, shr)
331 		__field(void *, shrink)
332 		__field(long, unused_scan)
333 		__field(long, new_scan)
334 		__field(long, total_scan)
335 		__field(int, nid)
336 		__field(int, retval)
337 		__field(u64, memcg_id)
338 	),
339 
340 	TP_fast_assign(
341 		__entry->shr = shr;
342 		__entry->shrink = shr->scan_objects;
343 		__entry->unused_scan = unused_scan_cnt;
344 		__entry->new_scan = new_scan_cnt;
345 		__entry->total_scan = total_scan;
346 		__entry->nid = nid;
347 		__entry->retval = shrinker_retval;
348 		__entry->memcg_id = mem_cgroup_id(memcg);
349 	),
350 
351 	TP_printk("%pS %p: nid: %d pid: %d memcg_id: %llu unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d %s",
352 		__entry->shrink,
353 		__entry->shr,
354 		__entry->nid,
355 		__entry->ent.pid,
356 		__entry->memcg_id,
357 		__entry->unused_scan,
358 		__entry->new_scan,
359 		__entry->total_scan,
360 		__entry->retval,
361 		__event_in_irq() ? "(in-irq)" : "")
362 );
363 
364 TRACE_EVENT(mm_vmscan_lru_isolate,
365 	TP_PROTO(int highest_zoneidx,
366 		int order,
367 		unsigned long nr_requested,
368 		unsigned long nr_scanned,
369 		unsigned long nr_skipped,
370 		unsigned long nr_taken,
371 		int lru),
372 
373 	TP_ARGS(highest_zoneidx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, lru),
374 
375 	TP_STRUCT__entry(
376 		__field(int, highest_zoneidx)
377 		__field(int, order)
378 		__field(unsigned long, nr_requested)
379 		__field(unsigned long, nr_scanned)
380 		__field(unsigned long, nr_skipped)
381 		__field(unsigned long, nr_taken)
382 		__field(int, lru)
383 	),
384 
385 	TP_fast_assign(
386 		__entry->highest_zoneidx = highest_zoneidx;
387 		__entry->order = order;
388 		__entry->nr_requested = nr_requested;
389 		__entry->nr_scanned = nr_scanned;
390 		__entry->nr_skipped = nr_skipped;
391 		__entry->nr_taken = nr_taken;
392 		__entry->lru = lru;
393 	),
394 
395 	/*
396 	 * classzone is previous name of the highest_zoneidx.
397 	 * Reason not to change it is the ABI requirement of the tracepoint.
398 	 */
399 	TP_printk("classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu lru=%s",
400 		__entry->highest_zoneidx,
401 		__entry->order,
402 		__entry->nr_requested,
403 		__entry->nr_scanned,
404 		__entry->nr_skipped,
405 		__entry->nr_taken,
406 		__print_symbolic(__entry->lru, LRU_NAMES))
407 );
408 
409 TRACE_EVENT(mm_vmscan_write_folio,
410 
411 	TP_PROTO(struct folio *folio),
412 
413 	TP_ARGS(folio),
414 
415 	TP_STRUCT__entry(
416 		__field(unsigned long, pfn)
417 		__field(int, reclaim_flags)
418 	),
419 
420 	TP_fast_assign(
421 		__entry->pfn = folio_pfn(folio);
422 		__entry->reclaim_flags = trace_reclaim_flags(
423 						folio_is_file_lru(folio));
424 	),
425 
426 	TP_printk("page=%p pfn=0x%lx flags=%s",
427 		pfn_to_page(__entry->pfn),
428 		__entry->pfn,
429 		show_reclaim_flags(__entry->reclaim_flags))
430 );
431 
432 TRACE_EVENT(mm_vmscan_reclaim_pages,
433 
434 	TP_PROTO(int nid,
435 		unsigned long nr_scanned, unsigned long nr_reclaimed,
436 		struct reclaim_stat *stat),
437 
438 	TP_ARGS(nid, nr_scanned, nr_reclaimed, stat),
439 
440 	TP_STRUCT__entry(
441 		__field(int, nid)
442 		__field(unsigned long, nr_scanned)
443 		__field(unsigned long, nr_reclaimed)
444 		__field(unsigned long, nr_dirty)
445 		__field(unsigned long, nr_writeback)
446 		__field(unsigned long, nr_congested)
447 		__field(unsigned long, nr_immediate)
448 		__field(unsigned int, nr_activate0)
449 		__field(unsigned int, nr_activate1)
450 		__field(unsigned long, nr_ref_keep)
451 		__field(unsigned long, nr_unmap_fail)
452 	),
453 
454 	TP_fast_assign(
455 		__entry->nid = nid;
456 		__entry->nr_scanned = nr_scanned;
457 		__entry->nr_reclaimed = nr_reclaimed;
458 		__entry->nr_dirty = stat->nr_dirty;
459 		__entry->nr_writeback = stat->nr_writeback;
460 		__entry->nr_congested = stat->nr_congested;
461 		__entry->nr_immediate = stat->nr_immediate;
462 		__entry->nr_activate0 = stat->nr_activate[0];
463 		__entry->nr_activate1 = stat->nr_activate[1];
464 		__entry->nr_ref_keep = stat->nr_ref_keep;
465 		__entry->nr_unmap_fail = stat->nr_unmap_fail;
466 	),
467 
468 	TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld",
469 		__entry->nid,
470 		__entry->nr_scanned, __entry->nr_reclaimed,
471 		__entry->nr_dirty, __entry->nr_writeback,
472 		__entry->nr_congested, __entry->nr_immediate,
473 		__entry->nr_activate0, __entry->nr_activate1,
474 		__entry->nr_ref_keep, __entry->nr_unmap_fail)
475 );
476 
477 TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
478 
479 	TP_PROTO(int nid,
480 		unsigned long nr_scanned, unsigned long nr_reclaimed,
481 		struct reclaim_stat *stat, int priority, int file),
482 
483 	TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, priority, file),
484 
485 	TP_STRUCT__entry(
486 		__field(int, nid)
487 		__field(unsigned long, nr_scanned)
488 		__field(unsigned long, nr_reclaimed)
489 		__field(unsigned long, nr_dirty)
490 		__field(unsigned long, nr_writeback)
491 		__field(unsigned long, nr_congested)
492 		__field(unsigned long, nr_immediate)
493 		__field(unsigned int, nr_activate0)
494 		__field(unsigned int, nr_activate1)
495 		__field(unsigned long, nr_ref_keep)
496 		__field(unsigned long, nr_unmap_fail)
497 		__field(int, priority)
498 		__field(int, reclaim_flags)
499 	),
500 
501 	TP_fast_assign(
502 		__entry->nid = nid;
503 		__entry->nr_scanned = nr_scanned;
504 		__entry->nr_reclaimed = nr_reclaimed;
505 		__entry->nr_dirty = stat->nr_dirty;
506 		__entry->nr_writeback = stat->nr_writeback;
507 		__entry->nr_congested = stat->nr_congested;
508 		__entry->nr_immediate = stat->nr_immediate;
509 		__entry->nr_activate0 = stat->nr_activate[0];
510 		__entry->nr_activate1 = stat->nr_activate[1];
511 		__entry->nr_ref_keep = stat->nr_ref_keep;
512 		__entry->nr_unmap_fail = stat->nr_unmap_fail;
513 		__entry->priority = priority;
514 		__entry->reclaim_flags = trace_reclaim_flags(file);
515 	),
516 
517 	TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
518 		__entry->nid,
519 		__entry->nr_scanned, __entry->nr_reclaimed,
520 		__entry->nr_dirty, __entry->nr_writeback,
521 		__entry->nr_congested, __entry->nr_immediate,
522 		__entry->nr_activate0, __entry->nr_activate1,
523 		__entry->nr_ref_keep, __entry->nr_unmap_fail,
524 		__entry->priority,
525 		show_reclaim_flags(__entry->reclaim_flags))
526 );
527 
528 TRACE_EVENT(mm_vmscan_lru_shrink_active,
529 
530 	TP_PROTO(int nid, unsigned long nr_taken,
531 		unsigned long nr_active, unsigned long nr_deactivated,
532 		unsigned long nr_referenced, int priority, int file),
533 
534 	TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file),
535 
536 	TP_STRUCT__entry(
537 		__field(int, nid)
538 		__field(unsigned long, nr_taken)
539 		__field(unsigned long, nr_active)
540 		__field(unsigned long, nr_deactivated)
541 		__field(unsigned long, nr_referenced)
542 		__field(int, priority)
543 		__field(int, reclaim_flags)
544 	),
545 
546 	TP_fast_assign(
547 		__entry->nid = nid;
548 		__entry->nr_taken = nr_taken;
549 		__entry->nr_active = nr_active;
550 		__entry->nr_deactivated = nr_deactivated;
551 		__entry->nr_referenced = nr_referenced;
552 		__entry->priority = priority;
553 		__entry->reclaim_flags = trace_reclaim_flags(file);
554 	),
555 
556 	TP_printk("nid=%d nr_taken=%ld nr_active=%ld nr_deactivated=%ld nr_referenced=%ld priority=%d flags=%s",
557 		__entry->nid,
558 		__entry->nr_taken,
559 		__entry->nr_active, __entry->nr_deactivated, __entry->nr_referenced,
560 		__entry->priority,
561 		show_reclaim_flags(__entry->reclaim_flags))
562 );
563 
564 TRACE_EVENT(mm_vmscan_node_reclaim_begin,
565 
566 	TP_PROTO(int nid, int order, gfp_t gfp_flags),
567 
568 	TP_ARGS(nid, order, gfp_flags),
569 
570 	TP_STRUCT__entry(
571 		__field(int, nid)
572 		__field(int, order)
573 		__field(unsigned long, gfp_flags)
574 	),
575 
576 	TP_fast_assign(
577 		__entry->nid = nid;
578 		__entry->order = order;
579 		__entry->gfp_flags = (__force unsigned long)gfp_flags;
580 	),
581 
582 	TP_printk("nid=%d order=%d gfp_flags=%s",
583 		__entry->nid,
584 		__entry->order,
585 		show_gfp_flags(__entry->gfp_flags))
586 );
587 
588 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_node_reclaim_end,
589 
590 	TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg),
591 
592 	TP_ARGS(nr_reclaimed, memcg)
593 );
594 
595 TRACE_EVENT(mm_vmscan_throttled,
596 
597 	TP_PROTO(int nid, int usec_timeout, int usec_delayed, int reason),
598 
599 	TP_ARGS(nid, usec_timeout, usec_delayed, reason),
600 
601 	TP_STRUCT__entry(
602 		__field(int, nid)
603 		__field(int, usec_timeout)
604 		__field(int, usec_delayed)
605 		__field(int, reason)
606 	),
607 
608 	TP_fast_assign(
609 		__entry->nid = nid;
610 		__entry->usec_timeout = usec_timeout;
611 		__entry->usec_delayed = usec_delayed;
612 		__entry->reason = 1U << reason;
613 	),
614 
615 	TP_printk("nid=%d usec_timeout=%d usect_delayed=%d reason=%s",
616 		__entry->nid,
617 		__entry->usec_timeout,
618 		__entry->usec_delayed,
619 		show_throttle_flags(__entry->reason))
620 );
621 
622 TRACE_EVENT(mm_vmscan_kswapd_reclaim_fail,
623 
624 	TP_PROTO(int nid, int failures),
625 
626 	TP_ARGS(nid, failures),
627 
628 	TP_STRUCT__entry(
629 		__field(int, nid)
630 		__field(int, failures)
631 	),
632 
633 	TP_fast_assign(
634 		__entry->nid = nid;
635 		__entry->failures = failures;
636 	),
637 
638 	TP_printk("nid=%d failures=%d",
639 		__entry->nid, __entry->failures)
640 );
641 
642 TRACE_EVENT(mm_vmscan_kswapd_clear_hopeless,
643 
644 	TP_PROTO(int nid, int reason),
645 
646 	TP_ARGS(nid, reason),
647 
648 	TP_STRUCT__entry(
649 		__field(int, nid)
650 		__field(int, reason)
651 	),
652 
653 	TP_fast_assign(
654 		__entry->nid = nid;
655 		__entry->reason = reason;
656 	),
657 
658 	TP_printk("nid=%d reason=%s",
659 		__entry->nid,
660 		__print_symbolic(__entry->reason, kswapd_clear_hopeless_reason_ops))
661 );
662 #endif /* _TRACE_VMSCAN_H */
663 
664 /* This part must be outside protection */
665 #include <trace/define_trace.h>
666