projects/linux·blob master · refs

665 lines · 17.2 KiB

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
43TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_OTHER);
44TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_KSWAPD);
45TRACE_DEFINE_ENUM(KSWAPD_CLEAR_HOPELESS_DIRECT);
46TRACE_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
59TRACE_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
76TRACE_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
99TRACE_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
123TRACE_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
151TRACE_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
177DECLARE_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
203DEFINE_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
211DEFINE_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
218DEFINE_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
226DECLARE_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
249DEFINE_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
257DEFINE_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
264DEFINE_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
272TRACE_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
322TRACE_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
364TRACE_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
409TRACE_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
432TRACE_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
477TRACE_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
528TRACE_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
564TRACE_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
588DEFINE_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
595TRACE_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
622TRACE_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
642TRACE_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>