1/* SPDX-License-Identifier: GPL-2.0 */ 2#undef TRACE_SYSTEM 3#define TRACE_SYSTEM walt 4 5#if !defined(_TRACE_WALT_H) || defined(TRACE_HEADER_MULTI_READ) 6#define _TRACE_WALT_H 7 8#include <linux/trace_seq.h> 9#include <linux/tracepoint.h> 10 11struct rq; 12extern const char *task_event_names[]; 13 14#if defined(CREATE_TRACE_POINTS) && defined(CONFIG_SCHED_WALT) 15static inline void __window_data(u32 *dst, u32 *src) 16{ 17 if (src) 18 memcpy(dst, src, nr_cpu_ids * sizeof(u32)); 19 else 20 memset(dst, 0, nr_cpu_ids * sizeof(u32)); 21} 22 23struct trace_seq; 24const char *__window_print(struct trace_seq *p, const u32 *buf, int buf_len) 25{ 26 int i; 27 const char *ret = p->buffer + seq_buf_used(&p->seq); 28 29 for (i = 0; i < buf_len; i++) 30 trace_seq_printf(p, "%u ", buf[i]); 31 32 trace_seq_putc(p, 0); 33 34 return ret; 35} 36 37static inline s64 __rq_update_sum(struct rq *rq, bool curr, bool new) 38{ 39 if (curr) 40 if (new) 41 return rq->nt_curr_runnable_sum; 42 else 43 return rq->curr_runnable_sum; 44 else 45 if (new) 46 return rq->nt_prev_runnable_sum; 47 else 48 return rq->prev_runnable_sum; 49} 50 51#ifdef CONFIG_SCHED_RTG 52static inline s64 __grp_update_sum(struct rq *rq, bool curr, bool new) 53{ 54 if (curr) 55 if (new) 56 return rq->grp_time.nt_curr_runnable_sum; 57 else 58 return rq->grp_time.curr_runnable_sum; 59 else 60 if (new) 61 return rq->grp_time.nt_prev_runnable_sum; 62 else 63 return rq->grp_time.prev_runnable_sum; 64} 65 66static inline s64 67__get_update_sum(struct rq *rq, enum migrate_types migrate_type, 68 bool src, bool new, bool curr) 69{ 70 switch (migrate_type) { 71 case RQ_TO_GROUP: 72 if (src) 73 return __rq_update_sum(rq, curr, new); 74 else 75 return __grp_update_sum(rq, curr, new); 76 case GROUP_TO_RQ: 77 if (src) 78 return __grp_update_sum(rq, curr, new); 79 else 80 return __rq_update_sum(rq, curr, new); 81 default: 82 WARN_ON_ONCE(1); 83 return -1; 84 } 85} 86#endif 87#endif 88 89TRACE_EVENT(sched_update_history, 90 91 TP_PROTO(struct rq *rq, struct task_struct *p, u32 runtime, int samples, 92 enum task_event evt), 93 94 TP_ARGS(rq, p, runtime, samples, evt), 95 96 TP_STRUCT__entry( 97 __array(char, comm, TASK_COMM_LEN) 98 __field(pid_t, pid) 99 __field(unsigned int, runtime) 100 __field(int, samples) 101 __field(enum task_event, evt) 102 __field(unsigned int, demand) 103 __array(u32, hist, RAVG_HIST_SIZE_MAX) 104 __field(int, cpu) 105 ), 106 107 TP_fast_assign( 108 memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 109 __entry->pid = p->pid; 110 __entry->runtime = runtime; 111 __entry->samples = samples; 112 __entry->evt = evt; 113 __entry->demand = p->ravg.demand; 114 memcpy(__entry->hist, p->ravg.sum_history, 115 RAVG_HIST_SIZE_MAX * sizeof(u32)); 116 __entry->cpu = rq->cpu; 117 ), 118 119 TP_printk("%d (%s): runtime %u samples %d event %s demand %u (hist: %u %u %u %u %u) cpu %d", 120 __entry->pid, __entry->comm, 121 __entry->runtime, __entry->samples, 122 task_event_names[__entry->evt], __entry->demand, 123 __entry->hist[0], __entry->hist[1], 124 __entry->hist[2], __entry->hist[3], 125 __entry->hist[4], __entry->cpu) 126); 127 128TRACE_EVENT(sched_update_task_ravg, 129 130 TP_PROTO(struct task_struct *p, struct rq *rq, enum task_event evt, 131 u64 wallclock, u64 irqtime), 132 133 TP_ARGS(p, rq, evt, wallclock, irqtime), 134 135 TP_STRUCT__entry( 136 __array(char, comm, TASK_COMM_LEN) 137 __field(pid_t, pid) 138 __field(pid_t, cur_pid) 139 __field(unsigned int, cur_freq) 140 __field(u64, wallclock) 141 __field(u64, mark_start) 142 __field(u64, delta_m) 143 __field(u64, win_start) 144 __field(u64, delta) 145 __field(u64, irqtime) 146 __field(enum task_event, evt) 147 __field(unsigned int, demand) 148 __field(unsigned int, sum) 149 __field(int, cpu) 150 __field(u64, rq_cs) 151 __field(u64, rq_ps) 152 __field(u32, curr_window) 153 __field(u32, prev_window) 154 __dynamic_array(u32, curr_sum, nr_cpu_ids) 155 __dynamic_array(u32, prev_sum, nr_cpu_ids) 156 __field(u64, nt_cs) 157 __field(u64, nt_ps) 158 __field(u32, active_windows) 159 ), 160 161 TP_fast_assign( 162 __entry->wallclock = wallclock; 163 __entry->win_start = rq->window_start; 164 __entry->delta = (wallclock - rq->window_start); 165 __entry->evt = evt; 166 __entry->cpu = rq->cpu; 167 __entry->cur_pid = rq->curr->pid; 168 __entry->cur_freq = rq->cluster->cur_freq; 169 memcpy(__entry->comm, p->comm, TASK_COMM_LEN); 170 __entry->pid = p->pid; 171 __entry->mark_start = p->ravg.mark_start; 172 __entry->delta_m = (wallclock - p->ravg.mark_start); 173 __entry->demand = p->ravg.demand; 174 __entry->sum = p->ravg.sum; 175 __entry->irqtime = irqtime; 176 __entry->rq_cs = rq->curr_runnable_sum; 177 __entry->rq_ps = rq->prev_runnable_sum; 178 __entry->curr_window = p->ravg.curr_window; 179 __entry->prev_window = p->ravg.prev_window; 180 __window_data(__get_dynamic_array(curr_sum), p->ravg.curr_window_cpu); 181 __window_data(__get_dynamic_array(prev_sum), p->ravg.prev_window_cpu); 182 __entry->nt_cs = rq->nt_curr_runnable_sum; 183 __entry->nt_ps = rq->nt_prev_runnable_sum; 184 __entry->active_windows = p->ravg.active_windows; 185 ), 186 187 TP_printk("wc %llu ws %llu delta %llu event %s cpu %d cur_freq %u cur_pid %d task %d (%s) ms %llu delta %llu demand %u sum %u irqtime %llu rq_cs %llu rq_ps %llu cur_window %u (%s) prev_window %u (%s) nt_cs %llu nt_ps %llu active_wins %u", 188 __entry->wallclock, __entry->win_start, __entry->delta, 189 task_event_names[__entry->evt], __entry->cpu, 190 __entry->cur_freq, __entry->cur_pid, 191 __entry->pid, __entry->comm, __entry->mark_start, 192 __entry->delta_m, __entry->demand, 193 __entry->sum, __entry->irqtime, 194 __entry->rq_cs, __entry->rq_ps, __entry->curr_window, 195 __window_print(p, __get_dynamic_array(curr_sum), nr_cpu_ids), 196 __entry->prev_window, 197 __window_print(p, __get_dynamic_array(prev_sum), nr_cpu_ids), 198 __entry->nt_cs, __entry->nt_ps, 199 __entry->active_windows) 200); 201 202extern const char *migrate_type_names[]; 203 204#ifdef CONFIG_SCHED_RTG 205TRACE_EVENT(sched_migration_update_sum, 206 207 TP_PROTO(struct task_struct *p, enum migrate_types migrate_type, struct rq *rq), 208 209 TP_ARGS(p, migrate_type, rq), 210 211 TP_STRUCT__entry( 212 __field(int, tcpu) 213 __field(int, pid) 214 __field(enum migrate_types, migrate_type) 215 __field(s64, src_cs) 216 __field(s64, src_ps) 217 __field(s64, dst_cs) 218 __field(s64, dst_ps) 219 __field(s64, src_nt_cs) 220 __field(s64, src_nt_ps) 221 __field(s64, dst_nt_cs) 222 __field(s64, dst_nt_ps) 223 ), 224 225 TP_fast_assign( 226 __entry->tcpu = task_cpu(p); 227 __entry->pid = p->pid; 228 __entry->migrate_type = migrate_type; 229 __entry->src_cs = __get_update_sum(rq, migrate_type, 230 true, false, true); 231 __entry->src_ps = __get_update_sum(rq, migrate_type, 232 true, false, false); 233 __entry->dst_cs = __get_update_sum(rq, migrate_type, 234 false, false, true); 235 __entry->dst_ps = __get_update_sum(rq, migrate_type, 236 false, false, false); 237 __entry->src_nt_cs = __get_update_sum(rq, migrate_type, 238 true, true, true); 239 __entry->src_nt_ps = __get_update_sum(rq, migrate_type, 240 true, true, false); 241 __entry->dst_nt_cs = __get_update_sum(rq, migrate_type, 242 false, true, true); 243 __entry->dst_nt_ps = __get_update_sum(rq, migrate_type, 244 false, true, false); 245 ), 246 247 TP_printk("pid %d task_cpu %d migrate_type %s src_cs %llu src_ps %llu dst_cs %lld dst_ps %lld src_nt_cs %llu src_nt_ps %llu dst_nt_cs %lld dst_nt_ps %lld", 248 __entry->pid, __entry->tcpu, migrate_type_names[__entry->migrate_type], 249 __entry->src_cs, __entry->src_ps, __entry->dst_cs, __entry->dst_ps, 250 __entry->src_nt_cs, __entry->src_nt_ps, __entry->dst_nt_cs, __entry->dst_nt_ps) 251); 252#endif 253#endif /* _TRACE_WALT_H */ 254 255/* This part must be outside protection */ 256#include <trace/define_trace.h> 257