1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM compaction 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_COMPACTION_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_COMPACTION_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/types.h> 9*4882a593Smuzhiyun #include <linux/list.h> 10*4882a593Smuzhiyun #include <linux/tracepoint.h> 11*4882a593Smuzhiyun #include <trace/events/mmflags.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_compaction_isolate_template, 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun TP_PROTO( 17*4882a593Smuzhiyun unsigned long start_pfn, 18*4882a593Smuzhiyun unsigned long end_pfn, 19*4882a593Smuzhiyun unsigned long nr_scanned, 20*4882a593Smuzhiyun unsigned long nr_taken), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken), 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun TP_STRUCT__entry( 25*4882a593Smuzhiyun __field(unsigned long, start_pfn) 26*4882a593Smuzhiyun __field(unsigned long, end_pfn) 27*4882a593Smuzhiyun __field(unsigned long, nr_scanned) 28*4882a593Smuzhiyun __field(unsigned long, nr_taken) 29*4882a593Smuzhiyun ), 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun TP_fast_assign( 32*4882a593Smuzhiyun __entry->start_pfn = start_pfn; 33*4882a593Smuzhiyun __entry->end_pfn = end_pfn; 34*4882a593Smuzhiyun __entry->nr_scanned = nr_scanned; 35*4882a593Smuzhiyun __entry->nr_taken = nr_taken; 36*4882a593Smuzhiyun ), 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun TP_printk("range=(0x%lx ~ 0x%lx) nr_scanned=%lu nr_taken=%lu", 39*4882a593Smuzhiyun __entry->start_pfn, 40*4882a593Smuzhiyun __entry->end_pfn, 41*4882a593Smuzhiyun __entry->nr_scanned, 42*4882a593Smuzhiyun __entry->nr_taken) 43*4882a593Smuzhiyun ); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_migratepages, 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun TP_PROTO( 48*4882a593Smuzhiyun unsigned long start_pfn, 49*4882a593Smuzhiyun unsigned long end_pfn, 50*4882a593Smuzhiyun unsigned long nr_scanned, 51*4882a593Smuzhiyun unsigned long nr_taken), 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken) 54*4882a593Smuzhiyun ); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_freepages, 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TP_PROTO( 59*4882a593Smuzhiyun unsigned long start_pfn, 60*4882a593Smuzhiyun unsigned long end_pfn, 61*4882a593Smuzhiyun unsigned long nr_scanned, 62*4882a593Smuzhiyun unsigned long nr_taken), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken) 65*4882a593Smuzhiyun ); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef CONFIG_COMPACTION 68*4882a593Smuzhiyun TRACE_EVENT(mm_compaction_migratepages, 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun TP_PROTO(unsigned long nr_all, 71*4882a593Smuzhiyun int migrate_rc, 72*4882a593Smuzhiyun struct list_head *migratepages), 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun TP_ARGS(nr_all, migrate_rc, migratepages), 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun TP_STRUCT__entry( 77*4882a593Smuzhiyun __field(unsigned long, nr_migrated) 78*4882a593Smuzhiyun __field(unsigned long, nr_failed) 79*4882a593Smuzhiyun ), 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun TP_fast_assign( 82*4882a593Smuzhiyun unsigned long nr_failed = 0; 83*4882a593Smuzhiyun struct list_head *page_lru; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * migrate_pages() returns either a non-negative number 87*4882a593Smuzhiyun * with the number of pages that failed migration, or an 88*4882a593Smuzhiyun * error code, in which case we need to count the remaining 89*4882a593Smuzhiyun * pages manually 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun if (migrate_rc >= 0) 92*4882a593Smuzhiyun nr_failed = migrate_rc; 93*4882a593Smuzhiyun else 94*4882a593Smuzhiyun list_for_each(page_lru, migratepages) 95*4882a593Smuzhiyun nr_failed++; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun __entry->nr_migrated = nr_all - nr_failed; 98*4882a593Smuzhiyun __entry->nr_failed = nr_failed; 99*4882a593Smuzhiyun ), 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun TP_printk("nr_migrated=%lu nr_failed=%lu", 102*4882a593Smuzhiyun __entry->nr_migrated, 103*4882a593Smuzhiyun __entry->nr_failed) 104*4882a593Smuzhiyun ); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun TRACE_EVENT(mm_compaction_begin, 107*4882a593Smuzhiyun TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn, 108*4882a593Smuzhiyun unsigned long free_pfn, unsigned long zone_end, bool sync), 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync), 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun TP_STRUCT__entry( 113*4882a593Smuzhiyun __field(unsigned long, zone_start) 114*4882a593Smuzhiyun __field(unsigned long, migrate_pfn) 115*4882a593Smuzhiyun __field(unsigned long, free_pfn) 116*4882a593Smuzhiyun __field(unsigned long, zone_end) 117*4882a593Smuzhiyun __field(bool, sync) 118*4882a593Smuzhiyun ), 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun TP_fast_assign( 121*4882a593Smuzhiyun __entry->zone_start = zone_start; 122*4882a593Smuzhiyun __entry->migrate_pfn = migrate_pfn; 123*4882a593Smuzhiyun __entry->free_pfn = free_pfn; 124*4882a593Smuzhiyun __entry->zone_end = zone_end; 125*4882a593Smuzhiyun __entry->sync = sync; 126*4882a593Smuzhiyun ), 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s", 129*4882a593Smuzhiyun __entry->zone_start, 130*4882a593Smuzhiyun __entry->migrate_pfn, 131*4882a593Smuzhiyun __entry->free_pfn, 132*4882a593Smuzhiyun __entry->zone_end, 133*4882a593Smuzhiyun __entry->sync ? "sync" : "async") 134*4882a593Smuzhiyun ); 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun TRACE_EVENT(mm_compaction_end, 137*4882a593Smuzhiyun TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn, 138*4882a593Smuzhiyun unsigned long free_pfn, unsigned long zone_end, bool sync, 139*4882a593Smuzhiyun int status), 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync, status), 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun TP_STRUCT__entry( 144*4882a593Smuzhiyun __field(unsigned long, zone_start) 145*4882a593Smuzhiyun __field(unsigned long, migrate_pfn) 146*4882a593Smuzhiyun __field(unsigned long, free_pfn) 147*4882a593Smuzhiyun __field(unsigned long, zone_end) 148*4882a593Smuzhiyun __field(bool, sync) 149*4882a593Smuzhiyun __field(int, status) 150*4882a593Smuzhiyun ), 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun TP_fast_assign( 153*4882a593Smuzhiyun __entry->zone_start = zone_start; 154*4882a593Smuzhiyun __entry->migrate_pfn = migrate_pfn; 155*4882a593Smuzhiyun __entry->free_pfn = free_pfn; 156*4882a593Smuzhiyun __entry->zone_end = zone_end; 157*4882a593Smuzhiyun __entry->sync = sync; 158*4882a593Smuzhiyun __entry->status = status; 159*4882a593Smuzhiyun ), 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s status=%s", 162*4882a593Smuzhiyun __entry->zone_start, 163*4882a593Smuzhiyun __entry->migrate_pfn, 164*4882a593Smuzhiyun __entry->free_pfn, 165*4882a593Smuzhiyun __entry->zone_end, 166*4882a593Smuzhiyun __entry->sync ? "sync" : "async", 167*4882a593Smuzhiyun __print_symbolic(__entry->status, COMPACTION_STATUS)) 168*4882a593Smuzhiyun ); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun TRACE_EVENT(mm_compaction_try_to_compact_pages, 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun TP_PROTO( 173*4882a593Smuzhiyun int order, 174*4882a593Smuzhiyun gfp_t gfp_mask, 175*4882a593Smuzhiyun int prio), 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun TP_ARGS(order, gfp_mask, prio), 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun TP_STRUCT__entry( 180*4882a593Smuzhiyun __field(int, order) 181*4882a593Smuzhiyun __field(gfp_t, gfp_mask) 182*4882a593Smuzhiyun __field(int, prio) 183*4882a593Smuzhiyun ), 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun TP_fast_assign( 186*4882a593Smuzhiyun __entry->order = order; 187*4882a593Smuzhiyun __entry->gfp_mask = gfp_mask; 188*4882a593Smuzhiyun __entry->prio = prio; 189*4882a593Smuzhiyun ), 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun TP_printk("order=%d gfp_mask=%s priority=%d", 192*4882a593Smuzhiyun __entry->order, 193*4882a593Smuzhiyun show_gfp_flags(__entry->gfp_mask), 194*4882a593Smuzhiyun __entry->prio) 195*4882a593Smuzhiyun ); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_compaction_suitable_template, 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun TP_PROTO(struct zone *zone, 200*4882a593Smuzhiyun int order, 201*4882a593Smuzhiyun int ret), 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun TP_ARGS(zone, order, ret), 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun TP_STRUCT__entry( 206*4882a593Smuzhiyun __field(int, nid) 207*4882a593Smuzhiyun __field(enum zone_type, idx) 208*4882a593Smuzhiyun __field(int, order) 209*4882a593Smuzhiyun __field(int, ret) 210*4882a593Smuzhiyun ), 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun TP_fast_assign( 213*4882a593Smuzhiyun __entry->nid = zone_to_nid(zone); 214*4882a593Smuzhiyun __entry->idx = zone_idx(zone); 215*4882a593Smuzhiyun __entry->order = order; 216*4882a593Smuzhiyun __entry->ret = ret; 217*4882a593Smuzhiyun ), 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun TP_printk("node=%d zone=%-8s order=%d ret=%s", 220*4882a593Smuzhiyun __entry->nid, 221*4882a593Smuzhiyun __print_symbolic(__entry->idx, ZONE_TYPE), 222*4882a593Smuzhiyun __entry->order, 223*4882a593Smuzhiyun __print_symbolic(__entry->ret, COMPACTION_STATUS)) 224*4882a593Smuzhiyun ); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_finished, 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun TP_PROTO(struct zone *zone, 229*4882a593Smuzhiyun int order, 230*4882a593Smuzhiyun int ret), 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun TP_ARGS(zone, order, ret) 233*4882a593Smuzhiyun ); 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_suitable, 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun TP_PROTO(struct zone *zone, 238*4882a593Smuzhiyun int order, 239*4882a593Smuzhiyun int ret), 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun TP_ARGS(zone, order, ret) 242*4882a593Smuzhiyun ); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_compaction_defer_template, 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun TP_PROTO(struct zone *zone, int order), 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun TP_ARGS(zone, order), 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun TP_STRUCT__entry( 251*4882a593Smuzhiyun __field(int, nid) 252*4882a593Smuzhiyun __field(enum zone_type, idx) 253*4882a593Smuzhiyun __field(int, order) 254*4882a593Smuzhiyun __field(unsigned int, considered) 255*4882a593Smuzhiyun __field(unsigned int, defer_shift) 256*4882a593Smuzhiyun __field(int, order_failed) 257*4882a593Smuzhiyun ), 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun TP_fast_assign( 260*4882a593Smuzhiyun __entry->nid = zone_to_nid(zone); 261*4882a593Smuzhiyun __entry->idx = zone_idx(zone); 262*4882a593Smuzhiyun __entry->order = order; 263*4882a593Smuzhiyun __entry->considered = zone->compact_considered; 264*4882a593Smuzhiyun __entry->defer_shift = zone->compact_defer_shift; 265*4882a593Smuzhiyun __entry->order_failed = zone->compact_order_failed; 266*4882a593Smuzhiyun ), 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun TP_printk("node=%d zone=%-8s order=%d order_failed=%d consider=%u limit=%lu", 269*4882a593Smuzhiyun __entry->nid, 270*4882a593Smuzhiyun __print_symbolic(__entry->idx, ZONE_TYPE), 271*4882a593Smuzhiyun __entry->order, 272*4882a593Smuzhiyun __entry->order_failed, 273*4882a593Smuzhiyun __entry->considered, 274*4882a593Smuzhiyun 1UL << __entry->defer_shift) 275*4882a593Smuzhiyun ); 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_deferred, 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun TP_PROTO(struct zone *zone, int order), 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun TP_ARGS(zone, order) 282*4882a593Smuzhiyun ); 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_compaction, 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun TP_PROTO(struct zone *zone, int order), 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun TP_ARGS(zone, order) 289*4882a593Smuzhiyun ); 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_reset, 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun TP_PROTO(struct zone *zone, int order), 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun TP_ARGS(zone, order) 296*4882a593Smuzhiyun ); 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun TRACE_EVENT(mm_compaction_kcompactd_sleep, 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun TP_PROTO(int nid), 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun TP_ARGS(nid), 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun TP_STRUCT__entry( 305*4882a593Smuzhiyun __field(int, nid) 306*4882a593Smuzhiyun ), 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun TP_fast_assign( 309*4882a593Smuzhiyun __entry->nid = nid; 310*4882a593Smuzhiyun ), 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun TP_printk("nid=%d", __entry->nid) 313*4882a593Smuzhiyun ); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun DECLARE_EVENT_CLASS(kcompactd_wake_template, 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun TP_PROTO(int nid, int order, enum zone_type highest_zoneidx), 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun TP_ARGS(nid, order, highest_zoneidx), 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun TP_STRUCT__entry( 322*4882a593Smuzhiyun __field(int, nid) 323*4882a593Smuzhiyun __field(int, order) 324*4882a593Smuzhiyun __field(enum zone_type, highest_zoneidx) 325*4882a593Smuzhiyun ), 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun TP_fast_assign( 328*4882a593Smuzhiyun __entry->nid = nid; 329*4882a593Smuzhiyun __entry->order = order; 330*4882a593Smuzhiyun __entry->highest_zoneidx = highest_zoneidx; 331*4882a593Smuzhiyun ), 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* 334*4882a593Smuzhiyun * classzone_idx is previous name of the highest_zoneidx. 335*4882a593Smuzhiyun * Reason not to change it is the ABI requirement of the tracepoint. 336*4882a593Smuzhiyun */ 337*4882a593Smuzhiyun TP_printk("nid=%d order=%d classzone_idx=%-8s", 338*4882a593Smuzhiyun __entry->nid, 339*4882a593Smuzhiyun __entry->order, 340*4882a593Smuzhiyun __print_symbolic(__entry->highest_zoneidx, ZONE_TYPE)) 341*4882a593Smuzhiyun ); 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun DEFINE_EVENT(kcompactd_wake_template, mm_compaction_wakeup_kcompactd, 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun TP_PROTO(int nid, int order, enum zone_type highest_zoneidx), 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun TP_ARGS(nid, order, highest_zoneidx) 348*4882a593Smuzhiyun ); 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun DEFINE_EVENT(kcompactd_wake_template, mm_compaction_kcompactd_wake, 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun TP_PROTO(int nid, int order, enum zone_type highest_zoneidx), 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun TP_ARGS(nid, order, highest_zoneidx) 355*4882a593Smuzhiyun ); 356*4882a593Smuzhiyun #endif 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun #endif /* _TRACE_COMPACTION_H */ 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun /* This part must be outside protection */ 361*4882a593Smuzhiyun #include <trace/define_trace.h> 362