1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM vmscan 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_VMSCAN_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_VMSCAN_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/types.h> 9*4882a593Smuzhiyun #include <linux/tracepoint.h> 10*4882a593Smuzhiyun #include <linux/mm.h> 11*4882a593Smuzhiyun #include <linux/memcontrol.h> 12*4882a593Smuzhiyun #include <trace/events/mmflags.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define RECLAIM_WB_ANON 0x0001u 15*4882a593Smuzhiyun #define RECLAIM_WB_FILE 0x0002u 16*4882a593Smuzhiyun #define RECLAIM_WB_MIXED 0x0010u 17*4882a593Smuzhiyun #define RECLAIM_WB_SYNC 0x0004u /* Unused, all reclaim async */ 18*4882a593Smuzhiyun #define RECLAIM_WB_ASYNC 0x0008u 19*4882a593Smuzhiyun #define RECLAIM_WB_LRU (RECLAIM_WB_ANON|RECLAIM_WB_FILE) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define show_reclaim_flags(flags) \ 22*4882a593Smuzhiyun (flags) ? __print_flags(flags, "|", \ 23*4882a593Smuzhiyun {RECLAIM_WB_ANON, "RECLAIM_WB_ANON"}, \ 24*4882a593Smuzhiyun {RECLAIM_WB_FILE, "RECLAIM_WB_FILE"}, \ 25*4882a593Smuzhiyun {RECLAIM_WB_MIXED, "RECLAIM_WB_MIXED"}, \ 26*4882a593Smuzhiyun {RECLAIM_WB_SYNC, "RECLAIM_WB_SYNC"}, \ 27*4882a593Smuzhiyun {RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \ 28*4882a593Smuzhiyun ) : "RECLAIM_WB_NONE" 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define trace_reclaim_flags(file) ( \ 31*4882a593Smuzhiyun (file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \ 32*4882a593Smuzhiyun (RECLAIM_WB_ASYNC) \ 33*4882a593Smuzhiyun ) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_kswapd_sleep, 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun TP_PROTO(int nid), 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun TP_ARGS(nid), 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun TP_STRUCT__entry( 42*4882a593Smuzhiyun __field( int, nid ) 43*4882a593Smuzhiyun ), 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun TP_fast_assign( 46*4882a593Smuzhiyun __entry->nid = nid; 47*4882a593Smuzhiyun ), 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun TP_printk("nid=%d", __entry->nid) 50*4882a593Smuzhiyun ); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_kswapd_wake, 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun TP_PROTO(int nid, int zid, int order), 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun TP_ARGS(nid, zid, order), 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TP_STRUCT__entry( 59*4882a593Smuzhiyun __field( int, nid ) 60*4882a593Smuzhiyun __field( int, zid ) 61*4882a593Smuzhiyun __field( int, order ) 62*4882a593Smuzhiyun ), 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun TP_fast_assign( 65*4882a593Smuzhiyun __entry->nid = nid; 66*4882a593Smuzhiyun __entry->zid = zid; 67*4882a593Smuzhiyun __entry->order = order; 68*4882a593Smuzhiyun ), 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun TP_printk("nid=%d order=%d", 71*4882a593Smuzhiyun __entry->nid, 72*4882a593Smuzhiyun __entry->order) 73*4882a593Smuzhiyun ); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_wakeup_kswapd, 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun TP_PROTO(int nid, int zid, int order, gfp_t gfp_flags), 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun TP_ARGS(nid, zid, order, gfp_flags), 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun TP_STRUCT__entry( 82*4882a593Smuzhiyun __field( int, nid ) 83*4882a593Smuzhiyun __field( int, zid ) 84*4882a593Smuzhiyun __field( int, order ) 85*4882a593Smuzhiyun __field( gfp_t, gfp_flags ) 86*4882a593Smuzhiyun ), 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun TP_fast_assign( 89*4882a593Smuzhiyun __entry->nid = nid; 90*4882a593Smuzhiyun __entry->zid = zid; 91*4882a593Smuzhiyun __entry->order = order; 92*4882a593Smuzhiyun __entry->gfp_flags = gfp_flags; 93*4882a593Smuzhiyun ), 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun TP_printk("nid=%d order=%d gfp_flags=%s", 96*4882a593Smuzhiyun __entry->nid, 97*4882a593Smuzhiyun __entry->order, 98*4882a593Smuzhiyun show_gfp_flags(__entry->gfp_flags)) 99*4882a593Smuzhiyun ); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template, 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_PROTO(int order, gfp_t gfp_flags), 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun TP_ARGS(order, gfp_flags), 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TP_STRUCT__entry( 108*4882a593Smuzhiyun __field( int, order ) 109*4882a593Smuzhiyun __field( gfp_t, gfp_flags ) 110*4882a593Smuzhiyun ), 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun TP_fast_assign( 113*4882a593Smuzhiyun __entry->order = order; 114*4882a593Smuzhiyun __entry->gfp_flags = gfp_flags; 115*4882a593Smuzhiyun ), 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun TP_printk("order=%d gfp_flags=%s", 118*4882a593Smuzhiyun __entry->order, 119*4882a593Smuzhiyun show_gfp_flags(__entry->gfp_flags)) 120*4882a593Smuzhiyun ); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin, 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun TP_PROTO(int order, gfp_t gfp_flags), 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun TP_ARGS(order, gfp_flags) 127*4882a593Smuzhiyun ); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #ifdef CONFIG_MEMCG 130*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin, 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun TP_PROTO(int order, gfp_t gfp_flags), 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun TP_ARGS(order, gfp_flags) 135*4882a593Smuzhiyun ); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin, 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun TP_PROTO(int order, gfp_t gfp_flags), 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun TP_ARGS(order, gfp_flags) 142*4882a593Smuzhiyun ); 143*4882a593Smuzhiyun #endif /* CONFIG_MEMCG */ 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template, 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun TP_PROTO(unsigned long nr_reclaimed), 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun TP_ARGS(nr_reclaimed), 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun TP_STRUCT__entry( 152*4882a593Smuzhiyun __field( unsigned long, nr_reclaimed ) 153*4882a593Smuzhiyun ), 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun TP_fast_assign( 156*4882a593Smuzhiyun __entry->nr_reclaimed = nr_reclaimed; 157*4882a593Smuzhiyun ), 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun TP_printk("nr_reclaimed=%lu", __entry->nr_reclaimed) 160*4882a593Smuzhiyun ); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end, 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun TP_PROTO(unsigned long nr_reclaimed), 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun TP_ARGS(nr_reclaimed) 167*4882a593Smuzhiyun ); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #ifdef CONFIG_MEMCG 170*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end, 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun TP_PROTO(unsigned long nr_reclaimed), 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun TP_ARGS(nr_reclaimed) 175*4882a593Smuzhiyun ); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end, 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun TP_PROTO(unsigned long nr_reclaimed), 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun TP_ARGS(nr_reclaimed) 182*4882a593Smuzhiyun ); 183*4882a593Smuzhiyun #endif /* CONFIG_MEMCG */ 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun TRACE_EVENT(mm_shrink_slab_start, 186*4882a593Smuzhiyun TP_PROTO(struct shrinker *shr, struct shrink_control *sc, 187*4882a593Smuzhiyun long nr_objects_to_shrink, unsigned long cache_items, 188*4882a593Smuzhiyun unsigned long long delta, unsigned long total_scan, 189*4882a593Smuzhiyun int priority), 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun TP_ARGS(shr, sc, nr_objects_to_shrink, cache_items, delta, total_scan, 192*4882a593Smuzhiyun priority), 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun TP_STRUCT__entry( 195*4882a593Smuzhiyun __field(struct shrinker *, shr) 196*4882a593Smuzhiyun __field(void *, shrink) 197*4882a593Smuzhiyun __field(int, nid) 198*4882a593Smuzhiyun __field(long, nr_objects_to_shrink) 199*4882a593Smuzhiyun __field(gfp_t, gfp_flags) 200*4882a593Smuzhiyun __field(unsigned long, cache_items) 201*4882a593Smuzhiyun __field(unsigned long long, delta) 202*4882a593Smuzhiyun __field(unsigned long, total_scan) 203*4882a593Smuzhiyun __field(int, priority) 204*4882a593Smuzhiyun ), 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun TP_fast_assign( 207*4882a593Smuzhiyun __entry->shr = shr; 208*4882a593Smuzhiyun __entry->shrink = shr->scan_objects; 209*4882a593Smuzhiyun __entry->nid = sc->nid; 210*4882a593Smuzhiyun __entry->nr_objects_to_shrink = nr_objects_to_shrink; 211*4882a593Smuzhiyun __entry->gfp_flags = sc->gfp_mask; 212*4882a593Smuzhiyun __entry->cache_items = cache_items; 213*4882a593Smuzhiyun __entry->delta = delta; 214*4882a593Smuzhiyun __entry->total_scan = total_scan; 215*4882a593Smuzhiyun __entry->priority = priority; 216*4882a593Smuzhiyun ), 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun TP_printk("%pS %p: nid: %d objects to shrink %ld gfp_flags %s cache items %ld delta %lld total_scan %ld priority %d", 219*4882a593Smuzhiyun __entry->shrink, 220*4882a593Smuzhiyun __entry->shr, 221*4882a593Smuzhiyun __entry->nid, 222*4882a593Smuzhiyun __entry->nr_objects_to_shrink, 223*4882a593Smuzhiyun show_gfp_flags(__entry->gfp_flags), 224*4882a593Smuzhiyun __entry->cache_items, 225*4882a593Smuzhiyun __entry->delta, 226*4882a593Smuzhiyun __entry->total_scan, 227*4882a593Smuzhiyun __entry->priority) 228*4882a593Smuzhiyun ); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun TRACE_EVENT(mm_shrink_slab_end, 231*4882a593Smuzhiyun TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval, 232*4882a593Smuzhiyun long unused_scan_cnt, long new_scan_cnt, long total_scan), 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt, 235*4882a593Smuzhiyun total_scan), 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun TP_STRUCT__entry( 238*4882a593Smuzhiyun __field(struct shrinker *, shr) 239*4882a593Smuzhiyun __field(int, nid) 240*4882a593Smuzhiyun __field(void *, shrink) 241*4882a593Smuzhiyun __field(long, unused_scan) 242*4882a593Smuzhiyun __field(long, new_scan) 243*4882a593Smuzhiyun __field(int, retval) 244*4882a593Smuzhiyun __field(long, total_scan) 245*4882a593Smuzhiyun ), 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun TP_fast_assign( 248*4882a593Smuzhiyun __entry->shr = shr; 249*4882a593Smuzhiyun __entry->nid = nid; 250*4882a593Smuzhiyun __entry->shrink = shr->scan_objects; 251*4882a593Smuzhiyun __entry->unused_scan = unused_scan_cnt; 252*4882a593Smuzhiyun __entry->new_scan = new_scan_cnt; 253*4882a593Smuzhiyun __entry->retval = shrinker_retval; 254*4882a593Smuzhiyun __entry->total_scan = total_scan; 255*4882a593Smuzhiyun ), 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun TP_printk("%pS %p: nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d", 258*4882a593Smuzhiyun __entry->shrink, 259*4882a593Smuzhiyun __entry->shr, 260*4882a593Smuzhiyun __entry->nid, 261*4882a593Smuzhiyun __entry->unused_scan, 262*4882a593Smuzhiyun __entry->new_scan, 263*4882a593Smuzhiyun __entry->total_scan, 264*4882a593Smuzhiyun __entry->retval) 265*4882a593Smuzhiyun ); 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_lru_isolate, 268*4882a593Smuzhiyun TP_PROTO(int highest_zoneidx, 269*4882a593Smuzhiyun int order, 270*4882a593Smuzhiyun unsigned long nr_requested, 271*4882a593Smuzhiyun unsigned long nr_scanned, 272*4882a593Smuzhiyun unsigned long nr_skipped, 273*4882a593Smuzhiyun unsigned long nr_taken, 274*4882a593Smuzhiyun isolate_mode_t isolate_mode, 275*4882a593Smuzhiyun int lru), 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun TP_ARGS(highest_zoneidx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, isolate_mode, lru), 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun TP_STRUCT__entry( 280*4882a593Smuzhiyun __field(int, highest_zoneidx) 281*4882a593Smuzhiyun __field(int, order) 282*4882a593Smuzhiyun __field(unsigned long, nr_requested) 283*4882a593Smuzhiyun __field(unsigned long, nr_scanned) 284*4882a593Smuzhiyun __field(unsigned long, nr_skipped) 285*4882a593Smuzhiyun __field(unsigned long, nr_taken) 286*4882a593Smuzhiyun __field(unsigned int, isolate_mode) 287*4882a593Smuzhiyun __field(int, lru) 288*4882a593Smuzhiyun ), 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun TP_fast_assign( 291*4882a593Smuzhiyun __entry->highest_zoneidx = highest_zoneidx; 292*4882a593Smuzhiyun __entry->order = order; 293*4882a593Smuzhiyun __entry->nr_requested = nr_requested; 294*4882a593Smuzhiyun __entry->nr_scanned = nr_scanned; 295*4882a593Smuzhiyun __entry->nr_skipped = nr_skipped; 296*4882a593Smuzhiyun __entry->nr_taken = nr_taken; 297*4882a593Smuzhiyun __entry->isolate_mode = (__force unsigned int)isolate_mode; 298*4882a593Smuzhiyun __entry->lru = lru; 299*4882a593Smuzhiyun ), 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun /* 302*4882a593Smuzhiyun * classzone is previous name of the highest_zoneidx. 303*4882a593Smuzhiyun * Reason not to change it is the ABI requirement of the tracepoint. 304*4882a593Smuzhiyun */ 305*4882a593Smuzhiyun TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu lru=%s", 306*4882a593Smuzhiyun __entry->isolate_mode, 307*4882a593Smuzhiyun __entry->highest_zoneidx, 308*4882a593Smuzhiyun __entry->order, 309*4882a593Smuzhiyun __entry->nr_requested, 310*4882a593Smuzhiyun __entry->nr_scanned, 311*4882a593Smuzhiyun __entry->nr_skipped, 312*4882a593Smuzhiyun __entry->nr_taken, 313*4882a593Smuzhiyun __print_symbolic(__entry->lru, LRU_NAMES)) 314*4882a593Smuzhiyun ); 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_writepage, 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun TP_PROTO(struct page *page), 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun TP_ARGS(page), 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun TP_STRUCT__entry( 323*4882a593Smuzhiyun __field(unsigned long, pfn) 324*4882a593Smuzhiyun __field(int, reclaim_flags) 325*4882a593Smuzhiyun ), 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun TP_fast_assign( 328*4882a593Smuzhiyun __entry->pfn = page_to_pfn(page); 329*4882a593Smuzhiyun __entry->reclaim_flags = trace_reclaim_flags( 330*4882a593Smuzhiyun page_is_file_lru(page)); 331*4882a593Smuzhiyun ), 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun TP_printk("page=%p pfn=%lu flags=%s", 334*4882a593Smuzhiyun pfn_to_page(__entry->pfn), 335*4882a593Smuzhiyun __entry->pfn, 336*4882a593Smuzhiyun show_reclaim_flags(__entry->reclaim_flags)) 337*4882a593Smuzhiyun ); 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_lru_shrink_inactive, 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun TP_PROTO(int nid, 342*4882a593Smuzhiyun unsigned long nr_scanned, unsigned long nr_reclaimed, 343*4882a593Smuzhiyun struct reclaim_stat *stat, int priority, int file), 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, priority, file), 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun TP_STRUCT__entry( 348*4882a593Smuzhiyun __field(int, nid) 349*4882a593Smuzhiyun __field(unsigned long, nr_scanned) 350*4882a593Smuzhiyun __field(unsigned long, nr_reclaimed) 351*4882a593Smuzhiyun __field(unsigned long, nr_dirty) 352*4882a593Smuzhiyun __field(unsigned long, nr_writeback) 353*4882a593Smuzhiyun __field(unsigned long, nr_congested) 354*4882a593Smuzhiyun __field(unsigned long, nr_immediate) 355*4882a593Smuzhiyun __field(unsigned int, nr_activate0) 356*4882a593Smuzhiyun __field(unsigned int, nr_activate1) 357*4882a593Smuzhiyun __field(unsigned long, nr_ref_keep) 358*4882a593Smuzhiyun __field(unsigned long, nr_unmap_fail) 359*4882a593Smuzhiyun __field(int, priority) 360*4882a593Smuzhiyun __field(int, reclaim_flags) 361*4882a593Smuzhiyun ), 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun TP_fast_assign( 364*4882a593Smuzhiyun __entry->nid = nid; 365*4882a593Smuzhiyun __entry->nr_scanned = nr_scanned; 366*4882a593Smuzhiyun __entry->nr_reclaimed = nr_reclaimed; 367*4882a593Smuzhiyun __entry->nr_dirty = stat->nr_dirty; 368*4882a593Smuzhiyun __entry->nr_writeback = stat->nr_writeback; 369*4882a593Smuzhiyun __entry->nr_congested = stat->nr_congested; 370*4882a593Smuzhiyun __entry->nr_immediate = stat->nr_immediate; 371*4882a593Smuzhiyun __entry->nr_activate0 = stat->nr_activate[0]; 372*4882a593Smuzhiyun __entry->nr_activate1 = stat->nr_activate[1]; 373*4882a593Smuzhiyun __entry->nr_ref_keep = stat->nr_ref_keep; 374*4882a593Smuzhiyun __entry->nr_unmap_fail = stat->nr_unmap_fail; 375*4882a593Smuzhiyun __entry->priority = priority; 376*4882a593Smuzhiyun __entry->reclaim_flags = trace_reclaim_flags(file); 377*4882a593Smuzhiyun ), 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun 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", 380*4882a593Smuzhiyun __entry->nid, 381*4882a593Smuzhiyun __entry->nr_scanned, __entry->nr_reclaimed, 382*4882a593Smuzhiyun __entry->nr_dirty, __entry->nr_writeback, 383*4882a593Smuzhiyun __entry->nr_congested, __entry->nr_immediate, 384*4882a593Smuzhiyun __entry->nr_activate0, __entry->nr_activate1, 385*4882a593Smuzhiyun __entry->nr_ref_keep, __entry->nr_unmap_fail, 386*4882a593Smuzhiyun __entry->priority, 387*4882a593Smuzhiyun show_reclaim_flags(__entry->reclaim_flags)) 388*4882a593Smuzhiyun ); 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_lru_shrink_active, 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun TP_PROTO(int nid, unsigned long nr_taken, 393*4882a593Smuzhiyun unsigned long nr_active, unsigned long nr_deactivated, 394*4882a593Smuzhiyun unsigned long nr_referenced, int priority, int file), 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file), 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun TP_STRUCT__entry( 399*4882a593Smuzhiyun __field(int, nid) 400*4882a593Smuzhiyun __field(unsigned long, nr_taken) 401*4882a593Smuzhiyun __field(unsigned long, nr_active) 402*4882a593Smuzhiyun __field(unsigned long, nr_deactivated) 403*4882a593Smuzhiyun __field(unsigned long, nr_referenced) 404*4882a593Smuzhiyun __field(int, priority) 405*4882a593Smuzhiyun __field(int, reclaim_flags) 406*4882a593Smuzhiyun ), 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun TP_fast_assign( 409*4882a593Smuzhiyun __entry->nid = nid; 410*4882a593Smuzhiyun __entry->nr_taken = nr_taken; 411*4882a593Smuzhiyun __entry->nr_active = nr_active; 412*4882a593Smuzhiyun __entry->nr_deactivated = nr_deactivated; 413*4882a593Smuzhiyun __entry->nr_referenced = nr_referenced; 414*4882a593Smuzhiyun __entry->priority = priority; 415*4882a593Smuzhiyun __entry->reclaim_flags = trace_reclaim_flags(file); 416*4882a593Smuzhiyun ), 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun TP_printk("nid=%d nr_taken=%ld nr_active=%ld nr_deactivated=%ld nr_referenced=%ld priority=%d flags=%s", 419*4882a593Smuzhiyun __entry->nid, 420*4882a593Smuzhiyun __entry->nr_taken, 421*4882a593Smuzhiyun __entry->nr_active, __entry->nr_deactivated, __entry->nr_referenced, 422*4882a593Smuzhiyun __entry->priority, 423*4882a593Smuzhiyun show_reclaim_flags(__entry->reclaim_flags)) 424*4882a593Smuzhiyun ); 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_inactive_list_is_low, 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun TP_PROTO(int nid, int reclaim_idx, 429*4882a593Smuzhiyun unsigned long total_inactive, unsigned long inactive, 430*4882a593Smuzhiyun unsigned long total_active, unsigned long active, 431*4882a593Smuzhiyun unsigned long ratio, int file), 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun TP_ARGS(nid, reclaim_idx, total_inactive, inactive, total_active, active, ratio, file), 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun TP_STRUCT__entry( 436*4882a593Smuzhiyun __field(int, nid) 437*4882a593Smuzhiyun __field(int, reclaim_idx) 438*4882a593Smuzhiyun __field(unsigned long, total_inactive) 439*4882a593Smuzhiyun __field(unsigned long, inactive) 440*4882a593Smuzhiyun __field(unsigned long, total_active) 441*4882a593Smuzhiyun __field(unsigned long, active) 442*4882a593Smuzhiyun __field(unsigned long, ratio) 443*4882a593Smuzhiyun __field(int, reclaim_flags) 444*4882a593Smuzhiyun ), 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun TP_fast_assign( 447*4882a593Smuzhiyun __entry->nid = nid; 448*4882a593Smuzhiyun __entry->reclaim_idx = reclaim_idx; 449*4882a593Smuzhiyun __entry->total_inactive = total_inactive; 450*4882a593Smuzhiyun __entry->inactive = inactive; 451*4882a593Smuzhiyun __entry->total_active = total_active; 452*4882a593Smuzhiyun __entry->active = active; 453*4882a593Smuzhiyun __entry->ratio = ratio; 454*4882a593Smuzhiyun __entry->reclaim_flags = trace_reclaim_flags(file) & 455*4882a593Smuzhiyun RECLAIM_WB_LRU; 456*4882a593Smuzhiyun ), 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun TP_printk("nid=%d reclaim_idx=%d total_inactive=%ld inactive=%ld total_active=%ld active=%ld ratio=%ld flags=%s", 459*4882a593Smuzhiyun __entry->nid, 460*4882a593Smuzhiyun __entry->reclaim_idx, 461*4882a593Smuzhiyun __entry->total_inactive, __entry->inactive, 462*4882a593Smuzhiyun __entry->total_active, __entry->active, 463*4882a593Smuzhiyun __entry->ratio, 464*4882a593Smuzhiyun show_reclaim_flags(__entry->reclaim_flags)) 465*4882a593Smuzhiyun ); 466*4882a593Smuzhiyun 467*4882a593Smuzhiyun TRACE_EVENT(mm_vmscan_node_reclaim_begin, 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun TP_PROTO(int nid, int order, gfp_t gfp_flags), 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun TP_ARGS(nid, order, gfp_flags), 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun TP_STRUCT__entry( 474*4882a593Smuzhiyun __field(int, nid) 475*4882a593Smuzhiyun __field(int, order) 476*4882a593Smuzhiyun __field(gfp_t, gfp_flags) 477*4882a593Smuzhiyun ), 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun TP_fast_assign( 480*4882a593Smuzhiyun __entry->nid = nid; 481*4882a593Smuzhiyun __entry->order = order; 482*4882a593Smuzhiyun __entry->gfp_flags = gfp_flags; 483*4882a593Smuzhiyun ), 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun TP_printk("nid=%d order=%d gfp_flags=%s", 486*4882a593Smuzhiyun __entry->nid, 487*4882a593Smuzhiyun __entry->order, 488*4882a593Smuzhiyun show_gfp_flags(__entry->gfp_flags)) 489*4882a593Smuzhiyun ); 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_node_reclaim_end, 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun TP_PROTO(unsigned long nr_reclaimed), 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun TP_ARGS(nr_reclaimed) 496*4882a593Smuzhiyun ); 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun #endif /* _TRACE_VMSCAN_H */ 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun /* This part must be outside protection */ 501*4882a593Smuzhiyun #include <trace/define_trace.h> 502