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