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