1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM oom 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_OOM_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_OOM_H 7*4882a593Smuzhiyun #include <linux/tracepoint.h> 8*4882a593Smuzhiyun #include <trace/events/mmflags.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun TRACE_EVENT(oom_score_adj_update, 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun TP_PROTO(struct task_struct *task), 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun TP_ARGS(task), 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun TP_STRUCT__entry( 17*4882a593Smuzhiyun __field( pid_t, pid) 18*4882a593Smuzhiyun __array( char, comm, TASK_COMM_LEN ) 19*4882a593Smuzhiyun __field( short, oom_score_adj) 20*4882a593Smuzhiyun ), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_fast_assign( 23*4882a593Smuzhiyun __entry->pid = task->pid; 24*4882a593Smuzhiyun memcpy(__entry->comm, task->comm, TASK_COMM_LEN); 25*4882a593Smuzhiyun __entry->oom_score_adj = task->signal->oom_score_adj; 26*4882a593Smuzhiyun ), 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun TP_printk("pid=%d comm=%s oom_score_adj=%hd", 29*4882a593Smuzhiyun __entry->pid, __entry->comm, __entry->oom_score_adj) 30*4882a593Smuzhiyun ); 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun TRACE_EVENT(reclaim_retry_zone, 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun TP_PROTO(struct zoneref *zoneref, 35*4882a593Smuzhiyun int order, 36*4882a593Smuzhiyun unsigned long reclaimable, 37*4882a593Smuzhiyun unsigned long available, 38*4882a593Smuzhiyun unsigned long min_wmark, 39*4882a593Smuzhiyun int no_progress_loops, 40*4882a593Smuzhiyun bool wmark_check), 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun TP_ARGS(zoneref, order, reclaimable, available, min_wmark, no_progress_loops, wmark_check), 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun TP_STRUCT__entry( 45*4882a593Smuzhiyun __field( int, node) 46*4882a593Smuzhiyun __field( int, zone_idx) 47*4882a593Smuzhiyun __field( int, order) 48*4882a593Smuzhiyun __field( unsigned long, reclaimable) 49*4882a593Smuzhiyun __field( unsigned long, available) 50*4882a593Smuzhiyun __field( unsigned long, min_wmark) 51*4882a593Smuzhiyun __field( int, no_progress_loops) 52*4882a593Smuzhiyun __field( bool, wmark_check) 53*4882a593Smuzhiyun ), 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun TP_fast_assign( 56*4882a593Smuzhiyun __entry->node = zone_to_nid(zoneref->zone); 57*4882a593Smuzhiyun __entry->zone_idx = zoneref->zone_idx; 58*4882a593Smuzhiyun __entry->order = order; 59*4882a593Smuzhiyun __entry->reclaimable = reclaimable; 60*4882a593Smuzhiyun __entry->available = available; 61*4882a593Smuzhiyun __entry->min_wmark = min_wmark; 62*4882a593Smuzhiyun __entry->no_progress_loops = no_progress_loops; 63*4882a593Smuzhiyun __entry->wmark_check = wmark_check; 64*4882a593Smuzhiyun ), 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun TP_printk("node=%d zone=%-8s order=%d reclaimable=%lu available=%lu min_wmark=%lu no_progress_loops=%d wmark_check=%d", 67*4882a593Smuzhiyun __entry->node, __print_symbolic(__entry->zone_idx, ZONE_TYPE), 68*4882a593Smuzhiyun __entry->order, 69*4882a593Smuzhiyun __entry->reclaimable, __entry->available, __entry->min_wmark, 70*4882a593Smuzhiyun __entry->no_progress_loops, 71*4882a593Smuzhiyun __entry->wmark_check) 72*4882a593Smuzhiyun ); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun TRACE_EVENT(mark_victim, 75*4882a593Smuzhiyun TP_PROTO(int pid), 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun TP_ARGS(pid), 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun TP_STRUCT__entry( 80*4882a593Smuzhiyun __field(int, pid) 81*4882a593Smuzhiyun ), 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun TP_fast_assign( 84*4882a593Smuzhiyun __entry->pid = pid; 85*4882a593Smuzhiyun ), 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun TP_printk("pid=%d", __entry->pid) 88*4882a593Smuzhiyun ); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun TRACE_EVENT(wake_reaper, 91*4882a593Smuzhiyun TP_PROTO(int pid), 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun TP_ARGS(pid), 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun TP_STRUCT__entry( 96*4882a593Smuzhiyun __field(int, pid) 97*4882a593Smuzhiyun ), 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun TP_fast_assign( 100*4882a593Smuzhiyun __entry->pid = pid; 101*4882a593Smuzhiyun ), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_printk("pid=%d", __entry->pid) 104*4882a593Smuzhiyun ); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun TRACE_EVENT(start_task_reaping, 107*4882a593Smuzhiyun TP_PROTO(int pid), 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun TP_ARGS(pid), 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun TP_STRUCT__entry( 112*4882a593Smuzhiyun __field(int, pid) 113*4882a593Smuzhiyun ), 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun TP_fast_assign( 116*4882a593Smuzhiyun __entry->pid = pid; 117*4882a593Smuzhiyun ), 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun TP_printk("pid=%d", __entry->pid) 120*4882a593Smuzhiyun ); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun TRACE_EVENT(finish_task_reaping, 123*4882a593Smuzhiyun TP_PROTO(int pid), 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun TP_ARGS(pid), 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun TP_STRUCT__entry( 128*4882a593Smuzhiyun __field(int, pid) 129*4882a593Smuzhiyun ), 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun TP_fast_assign( 132*4882a593Smuzhiyun __entry->pid = pid; 133*4882a593Smuzhiyun ), 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun TP_printk("pid=%d", __entry->pid) 136*4882a593Smuzhiyun ); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun TRACE_EVENT(skip_task_reaping, 139*4882a593Smuzhiyun TP_PROTO(int pid), 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun TP_ARGS(pid), 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun TP_STRUCT__entry( 144*4882a593Smuzhiyun __field(int, pid) 145*4882a593Smuzhiyun ), 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun TP_fast_assign( 148*4882a593Smuzhiyun __entry->pid = pid; 149*4882a593Smuzhiyun ), 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun TP_printk("pid=%d", __entry->pid) 152*4882a593Smuzhiyun ); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #ifdef CONFIG_COMPACTION 155*4882a593Smuzhiyun TRACE_EVENT(compact_retry, 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun TP_PROTO(int order, 158*4882a593Smuzhiyun enum compact_priority priority, 159*4882a593Smuzhiyun enum compact_result result, 160*4882a593Smuzhiyun int retries, 161*4882a593Smuzhiyun int max_retries, 162*4882a593Smuzhiyun bool ret), 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun TP_ARGS(order, priority, result, retries, max_retries, ret), 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun TP_STRUCT__entry( 167*4882a593Smuzhiyun __field( int, order) 168*4882a593Smuzhiyun __field( int, priority) 169*4882a593Smuzhiyun __field( int, result) 170*4882a593Smuzhiyun __field( int, retries) 171*4882a593Smuzhiyun __field( int, max_retries) 172*4882a593Smuzhiyun __field( bool, ret) 173*4882a593Smuzhiyun ), 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun TP_fast_assign( 176*4882a593Smuzhiyun __entry->order = order; 177*4882a593Smuzhiyun __entry->priority = priority; 178*4882a593Smuzhiyun __entry->result = compact_result_to_feedback(result); 179*4882a593Smuzhiyun __entry->retries = retries; 180*4882a593Smuzhiyun __entry->max_retries = max_retries; 181*4882a593Smuzhiyun __entry->ret = ret; 182*4882a593Smuzhiyun ), 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun TP_printk("order=%d priority=%s compaction_result=%s retries=%d max_retries=%d should_retry=%d", 185*4882a593Smuzhiyun __entry->order, 186*4882a593Smuzhiyun __print_symbolic(__entry->priority, COMPACTION_PRIORITY), 187*4882a593Smuzhiyun __print_symbolic(__entry->result, COMPACTION_FEEDBACK), 188*4882a593Smuzhiyun __entry->retries, __entry->max_retries, 189*4882a593Smuzhiyun __entry->ret) 190*4882a593Smuzhiyun ); 191*4882a593Smuzhiyun #endif /* CONFIG_COMPACTION */ 192*4882a593Smuzhiyun #endif 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* This part must be outside protection */ 195*4882a593Smuzhiyun #include <trace/define_trace.h> 196