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_wakeup_kswapd, 100 101 TP_PROTO(int nid, int zid, int order, gfp_t gfp_flags), 102 103 TP_ARGS(nid, zid, order, gfp_flags), 104 105 TP_STRUCT__entry( 106 __field( int, nid ) 107 __field( int, zid ) 108 __field( int, order ) 109 __field( unsigned long, gfp_flags ) 110 ), 111 112 TP_fast_assign( 113 __entry->nid = nid; 114 __entry->zid = zid; 115 __entry->order = order; 116 __entry->gfp_flags = (__force unsigned long)gfp_flags; 117 ), 118 119 TP_printk("nid=%d order=%d gfp_flags=%s", 120 __entry->nid, 121 __entry->order, 122 show_gfp_flags(__entry->gfp_flags)) 123 ); 124 125 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template, 126 127 TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg), 128 129 TP_ARGS(gfp_flags, order, memcg), 130 131 TP_STRUCT__entry( 132 __field( unsigned long, gfp_flags ) 133 __field( u64, memcg_id ) 134 __field( int, order ) 135 ), 136 137 TP_fast_assign( 138 __entry->gfp_flags = (__force unsigned long)gfp_flags; 139 __entry->order = order; 140 __entry->memcg_id = mem_cgroup_id(memcg); 141 ), 142 143 TP_printk("order=%d gfp_flags=%s pid=%d memcg_id=%llu %s", 144 __entry->order, 145 show_gfp_flags(__entry->gfp_flags), 146 __entry->ent.pid, 147 __entry->memcg_id, 148 __event_in_irq() ? "(in-irq)" : "") 149 ); 150 151 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin, 152 153 TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg), 154 155 TP_ARGS(gfp_flags, order, memcg) 156 ); 157 158 #ifdef CONFIG_MEMCG 159 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin, 160 161 TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg), 162 163 TP_ARGS(gfp_flags, order, memcg) 164 ); 165 166 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin, 167 168 TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg), 169 170 TP_ARGS(gfp_flags, order, memcg) 171 ); 172 #endif /* CONFIG_MEMCG */ 173 174 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template, 175 176 TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg), 177 178 TP_ARGS(nr_reclaimed, memcg), 179 180 TP_STRUCT__entry( 181 __field( unsigned long, nr_reclaimed ) 182 __field( u64, memcg_id ) 183 ), 184 185 TP_fast_assign( 186 __entry->nr_reclaimed = nr_reclaimed; 187 __entry->memcg_id = mem_cgroup_id(memcg); 188 ), 189 190 TP_printk("nr_reclaimed=%lu pid=%d memcg_id=%llu %s", 191 __entry->nr_reclaimed, 192 __entry->ent.pid, 193 __entry->memcg_id, 194 __event_in_irq() ? "(in-irq)" : "") 195 ); 196 197 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end, 198 199 TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg), 200 201 TP_ARGS(nr_reclaimed, memcg) 202 ); 203 204 #ifdef CONFIG_MEMCG 205 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end, 206 207 TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg), 208 209 TP_ARGS(nr_reclaimed, memcg) 210 ); 211 212 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end, 213 214 TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg), 215 216 TP_ARGS(nr_reclaimed, memcg) 217 ); 218 #endif /* CONFIG_MEMCG */ 219 220 TRACE_EVENT(mm_shrink_slab_start, 221 TP_PROTO(struct shrinker *shr, struct shrink_control *sc, 222 long nr_objects_to_shrink, unsigned long cache_items, 223 unsigned long long delta, unsigned long total_scan, 224 int priority, struct mem_cgroup *memcg), 225 226 TP_ARGS(shr, sc, nr_objects_to_shrink, cache_items, delta, total_scan, 227 priority, memcg), 228 229 TP_STRUCT__entry( 230 __field(struct shrinker *, shr) 231 __field(void *, shrink) 232 __field(long, nr_objects_to_shrink) 233 __field(unsigned long, gfp_flags) 234 __field(unsigned long, cache_items) 235 __field(unsigned long long, delta) 236 __field(unsigned long, total_scan) 237 __field(int, priority) 238 __field(int, nid) 239 __field(u64, memcg_id) 240 ), 241 242 TP_fast_assign( 243 __entry->shr = shr; 244 __entry->shrink = shr->scan_objects; 245 __entry->nr_objects_to_shrink = nr_objects_to_shrink; 246 __entry->gfp_flags = (__force unsigned long)sc->gfp_mask; 247 __entry->cache_items = cache_items; 248 __entry->delta = delta; 249 __entry->total_scan = total_scan; 250 __entry->priority = priority; 251 __entry->nid = sc->nid; 252 __entry->memcg_id = mem_cgroup_id(memcg); 253 ), 254 255 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", 256 __entry->shrink, 257 __entry->shr, 258 __entry->nid, 259 __entry->ent.pid, 260 __entry->memcg_id, 261 __entry->nr_objects_to_shrink, 262 show_gfp_flags(__entry->gfp_flags), 263 __entry->cache_items, 264 __entry->delta, 265 __entry->total_scan, 266 __entry->priority, 267 __event_in_irq() ? "(in-irq)" : "") 268 ); 269 270 TRACE_EVENT(mm_shrink_slab_end, 271 TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval, 272 long unused_scan_cnt, long new_scan_cnt, long total_scan, struct mem_cgroup *memcg), 273 274 TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt, 275 total_scan, memcg), 276 277 TP_STRUCT__entry( 278 __field(struct shrinker *, shr) 279 __field(void *, shrink) 280 __field(long, unused_scan) 281 __field(long, new_scan) 282 __field(long, total_scan) 283 __field(int, nid) 284 __field(int, retval) 285 __field(u64, memcg_id) 286 ), 287 288 TP_fast_assign( 289 __entry->shr = shr; 290 __entry->shrink = shr->scan_objects; 291 __entry->unused_scan = unused_scan_cnt; 292 __entry->new_scan = new_scan_cnt; 293 __entry->total_scan = total_scan; 294 __entry->nid = nid; 295 __entry->retval = shrinker_retval; 296 __entry->memcg_id = mem_cgroup_id(memcg); 297 ), 298 299 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", 300 __entry->shrink, 301 __entry->shr, 302 __entry->nid, 303 __entry->ent.pid, 304 __entry->memcg_id, 305 __entry->unused_scan, 306 __entry->new_scan, 307 __entry->total_scan, 308 __entry->retval, 309 __event_in_irq() ? "(in-irq)" : "") 310 ); 311 312 TRACE_EVENT(mm_vmscan_lru_isolate, 313 TP_PROTO(int highest_zoneidx, 314 int order, 315 unsigned long nr_requested, 316 unsigned long nr_scanned, 317 unsigned long nr_skipped, 318 unsigned long nr_taken, 319 int lru), 320 321 TP_ARGS(highest_zoneidx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, lru), 322 323 TP_STRUCT__entry( 324 __field(int, highest_zoneidx) 325 __field(int, order) 326 __field(unsigned long, nr_requested) 327 __field(unsigned long, nr_scanned) 328 __field(unsigned long, nr_skipped) 329 __field(unsigned long, nr_taken) 330 __field(int, lru) 331 ), 332 333 TP_fast_assign( 334 __entry->highest_zoneidx = highest_zoneidx; 335 __entry->order = order; 336 __entry->nr_requested = nr_requested; 337 __entry->nr_scanned = nr_scanned; 338 __entry->nr_skipped = nr_skipped; 339 __entry->nr_taken = nr_taken; 340 __entry->lru = lru; 341 ), 342 343 /* 344 * classzone is previous name of the highest_zoneidx. 345 * Reason not to change it is the ABI requirement of the tracepoint. 346 */ 347 TP_printk("classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu lru=%s", 348 __entry->highest_zoneidx, 349 __entry->order, 350 __entry->nr_requested, 351 __entry->nr_scanned, 352 __entry->nr_skipped, 353 __entry->nr_taken, 354 __print_symbolic(__entry->lru, LRU_NAMES)) 355 ); 356 357 TRACE_EVENT(mm_vmscan_write_folio, 358 359 TP_PROTO(struct folio *folio), 360 361 TP_ARGS(folio), 362 363 TP_STRUCT__entry( 364 __field(unsigned long, pfn) 365 __field(int, reclaim_flags) 366 ), 367 368 TP_fast_assign( 369 __entry->pfn = folio_pfn(folio); 370 __entry->reclaim_flags = trace_reclaim_flags( 371 folio_is_file_lru(folio)); 372 ), 373 374 TP_printk("page=%p pfn=0x%lx flags=%s", 375 pfn_to_page(__entry->pfn), 376 __entry->pfn, 377 show_reclaim_flags(__entry->reclaim_flags)) 378 ); 379 380 TRACE_EVENT(mm_vmscan_reclaim_pages, 381 382 TP_PROTO(int nid, 383 unsigned long nr_scanned, unsigned long nr_reclaimed, 384 struct reclaim_stat *stat), 385 386 TP_ARGS(nid, nr_scanned, nr_reclaimed, stat), 387 388 TP_STRUCT__entry( 389 __field(int, nid) 390 __field(unsigned long, nr_scanned) 391 __field(unsigned long, nr_reclaimed) 392 __field(unsigned long, nr_dirty) 393 __field(unsigned long, nr_writeback) 394 __field(unsigned long, nr_congested) 395 __field(unsigned long, nr_immediate) 396 __field(unsigned int, nr_activate0) 397 __field(unsigned int, nr_activate1) 398 __field(unsigned long, nr_ref_keep) 399 __field(unsigned long, nr_unmap_fail) 400 ), 401 402 TP_fast_assign( 403 __entry->nid = nid; 404 __entry->nr_scanned = nr_scanned; 405 __entry->nr_reclaimed = nr_reclaimed; 406 __entry->nr_dirty = stat->nr_dirty; 407 __entry->nr_writeback = stat->nr_writeback; 408 __entry->nr_congested = stat->nr_congested; 409 __entry->nr_immediate = stat->nr_immediate; 410 __entry->nr_activate0 = stat->nr_activate[0]; 411 __entry->nr_activate1 = stat->nr_activate[1]; 412 __entry->nr_ref_keep = stat->nr_ref_keep; 413 __entry->nr_unmap_fail = stat->nr_unmap_fail; 414 ), 415 416 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", 417 __entry->nid, 418 __entry->nr_scanned, __entry->nr_reclaimed, 419 __entry->nr_dirty, __entry->nr_writeback, 420 __entry->nr_congested, __entry->nr_immediate, 421 __entry->nr_activate0, __entry->nr_activate1, 422 __entry->nr_ref_keep, __entry->nr_unmap_fail) 423 ); 424 425 TRACE_EVENT(mm_vmscan_lru_shrink_inactive, 426 427 TP_PROTO(int nid, 428 unsigned long nr_scanned, unsigned long nr_reclaimed, 429 struct reclaim_stat *stat, int priority, int file), 430 431 TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, priority, file), 432 433 TP_STRUCT__entry( 434 __field(int, nid) 435 __field(unsigned long, nr_scanned) 436 __field(unsigned long, nr_reclaimed) 437 __field(unsigned long, nr_dirty) 438 __field(unsigned long, nr_writeback) 439 __field(unsigned long, nr_congested) 440 __field(unsigned long, nr_immediate) 441 __field(unsigned int, nr_activate0) 442 __field(unsigned int, nr_activate1) 443 __field(unsigned long, nr_ref_keep) 444 __field(unsigned long, nr_unmap_fail) 445 __field(int, priority) 446 __field(int, reclaim_flags) 447 ), 448 449 TP_fast_assign( 450 __entry->nid = nid; 451 __entry->nr_scanned = nr_scanned; 452 __entry->nr_reclaimed = nr_reclaimed; 453 __entry->nr_dirty = stat->nr_dirty; 454 __entry->nr_writeback = stat->nr_writeback; 455 __entry->nr_congested = stat->nr_congested; 456 __entry->nr_immediate = stat->nr_immediate; 457 __entry->nr_activate0 = stat->nr_activate[0]; 458 __entry->nr_activate1 = stat->nr_activate[1]; 459 __entry->nr_ref_keep = stat->nr_ref_keep; 460 __entry->nr_unmap_fail = stat->nr_unmap_fail; 461 __entry->priority = priority; 462 __entry->reclaim_flags = trace_reclaim_flags(file); 463 ), 464 465 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", 466 __entry->nid, 467 __entry->nr_scanned, __entry->nr_reclaimed, 468 __entry->nr_dirty, __entry->nr_writeback, 469 __entry->nr_congested, __entry->nr_immediate, 470 __entry->nr_activate0, __entry->nr_activate1, 471 __entry->nr_ref_keep, __entry->nr_unmap_fail, 472 __entry->priority, 473 show_reclaim_flags(__entry->reclaim_flags)) 474 ); 475 476 TRACE_EVENT(mm_vmscan_lru_shrink_active, 477 478 TP_PROTO(int nid, unsigned long nr_taken, 479 unsigned long nr_active, unsigned long nr_deactivated, 480 unsigned long nr_referenced, int priority, int file), 481 482 TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file), 483 484 TP_STRUCT__entry( 485 __field(int, nid) 486 __field(unsigned long, nr_taken) 487 __field(unsigned long, nr_active) 488 __field(unsigned long, nr_deactivated) 489 __field(unsigned long, nr_referenced) 490 __field(int, priority) 491 __field(int, reclaim_flags) 492 ), 493 494 TP_fast_assign( 495 __entry->nid = nid; 496 __entry->nr_taken = nr_taken; 497 __entry->nr_active = nr_active; 498 __entry->nr_deactivated = nr_deactivated; 499 __entry->nr_referenced = nr_referenced; 500 __entry->priority = priority; 501 __entry->reclaim_flags = trace_reclaim_flags(file); 502 ), 503 504 TP_printk("nid=%d nr_taken=%ld nr_active=%ld nr_deactivated=%ld nr_referenced=%ld priority=%d flags=%s", 505 __entry->nid, 506 __entry->nr_taken, 507 __entry->nr_active, __entry->nr_deactivated, __entry->nr_referenced, 508 __entry->priority, 509 show_reclaim_flags(__entry->reclaim_flags)) 510 ); 511 512 TRACE_EVENT(mm_vmscan_node_reclaim_begin, 513 514 TP_PROTO(int nid, int order, gfp_t gfp_flags), 515 516 TP_ARGS(nid, order, gfp_flags), 517 518 TP_STRUCT__entry( 519 __field(int, nid) 520 __field(int, order) 521 __field(unsigned long, gfp_flags) 522 ), 523 524 TP_fast_assign( 525 __entry->nid = nid; 526 __entry->order = order; 527 __entry->gfp_flags = (__force unsigned long)gfp_flags; 528 ), 529 530 TP_printk("nid=%d order=%d gfp_flags=%s", 531 __entry->nid, 532 __entry->order, 533 show_gfp_flags(__entry->gfp_flags)) 534 ); 535 536 DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_node_reclaim_end, 537 538 TP_PROTO(unsigned long nr_reclaimed, struct mem_cgroup *memcg), 539 540 TP_ARGS(nr_reclaimed, memcg) 541 ); 542 543 TRACE_EVENT(mm_vmscan_throttled, 544 545 TP_PROTO(int nid, int usec_timeout, int usec_delayed, int reason), 546 547 TP_ARGS(nid, usec_timeout, usec_delayed, reason), 548 549 TP_STRUCT__entry( 550 __field(int, nid) 551 __field(int, usec_timeout) 552 __field(int, usec_delayed) 553 __field(int, reason) 554 ), 555 556 TP_fast_assign( 557 __entry->nid = nid; 558 __entry->usec_timeout = usec_timeout; 559 __entry->usec_delayed = usec_delayed; 560 __entry->reason = 1U << reason; 561 ), 562 563 TP_printk("nid=%d usec_timeout=%d usect_delayed=%d reason=%s", 564 __entry->nid, 565 __entry->usec_timeout, 566 __entry->usec_delayed, 567 show_throttle_flags(__entry->reason)) 568 ); 569 570 TRACE_EVENT(mm_vmscan_kswapd_reclaim_fail, 571 572 TP_PROTO(int nid, int failures), 573 574 TP_ARGS(nid, failures), 575 576 TP_STRUCT__entry( 577 __field(int, nid) 578 __field(int, failures) 579 ), 580 581 TP_fast_assign( 582 __entry->nid = nid; 583 __entry->failures = failures; 584 ), 585 586 TP_printk("nid=%d failures=%d", 587 __entry->nid, __entry->failures) 588 ); 589 590 TRACE_EVENT(mm_vmscan_kswapd_clear_hopeless, 591 592 TP_PROTO(int nid, int reason), 593 594 TP_ARGS(nid, reason), 595 596 TP_STRUCT__entry( 597 __field(int, nid) 598 __field(int, reason) 599 ), 600 601 TP_fast_assign( 602 __entry->nid = nid; 603 __entry->reason = reason; 604 ), 605 606 TP_printk("nid=%d reason=%s", 607 __entry->nid, 608 __print_symbolic(__entry->reason, kswapd_clear_hopeless_reason_ops)) 609 ); 610 #endif /* _TRACE_VMSCAN_H */ 611 612 /* This part must be outside protection */ 613 #include <trace/define_trace.h> 614