aboutsummaryrefslogtreecommitdiffstats
path: root/include/trace
diff options
context:
space:
mode:
Diffstat (limited to 'include/trace')
-rw-r--r--include/trace/events/litmus.h423
-rw-r--r--include/trace/ftrace.h5
2 files changed, 426 insertions, 2 deletions
diff --git a/include/trace/events/litmus.h b/include/trace/events/litmus.h
new file mode 100644
index 00000000000..ed50bc809e8
--- /dev/null
+++ b/include/trace/events/litmus.h
@@ -0,0 +1,423 @@
1/*
2 * LITMUS^RT kernel style scheduling tracepoints
3 */
4#undef TRACE_SYSTEM
5#define TRACE_SYSTEM litmus
6
7#if !defined(_SCHED_TASK_TRACEPOINT_H) || defined(TRACE_HEADER_MULTI_READ)
8#define _SCHED_TASK_TRACEPOINT_H
9
10#include <linux/tracepoint.h>
11
12#include <litmus/litmus.h>
13#include <litmus/rt_param.h>
14TRACE_EVENT(litmus_task_param,
15
16 TP_PROTO(struct task_struct *t),
17
18 TP_ARGS(t),
19
20 TP_STRUCT__entry(
21 __field( pid_t, pid )
22 __field( unsigned int, job )
23 __field( unsigned long long, wcet )
24 __field( unsigned long long, period )
25 __field( unsigned long long, phase )
26 __field( int, partition )
27 ),
28
29 TP_fast_assign(
30 __entry->pid = t ? t->pid : 0;
31 __entry->job = t ? t->rt_param.job_params.job_no : 0;
32 __entry->wcet = get_exec_cost(t);
33 __entry->period = get_rt_period(t);
34 __entry->phase = get_rt_phase(t);
35 __entry->partition = get_partition(t);
36 ),
37
38 TP_printk("period(%d, %Lu).\nwcet(%d, %Lu).\n",
39 __entry->pid, __entry->period,
40 __entry->pid, __entry->wcet)
41);
42
43/*
44 * Tracing jobs release
45 */
46TRACE_EVENT(litmus_task_release,
47
48 TP_PROTO(struct task_struct *t),
49
50 TP_ARGS(t),
51
52 TP_STRUCT__entry(
53 __field( pid_t, pid )
54 __field( unsigned int, job )
55 __field( unsigned long long, release )
56 __field( unsigned long long, deadline )
57 ),
58
59 TP_fast_assign(
60 __entry->pid = t ? t->pid : 0;
61 __entry->job = t ? t->rt_param.job_params.job_no : 0;
62 __entry->release = get_release(t);
63 __entry->deadline = get_deadline(t);
64 ),
65
66 TP_printk("release(job(%u, %u)): %Lu\ndeadline(job(%u, %u)): %Lu\n",
67 __entry->pid, __entry->job, __entry->release,
68 __entry->pid, __entry->job, __entry->deadline)
69);
70
71/*
72 * Tracepoint for switching to new task
73 */
74TRACE_EVENT(litmus_switch_to,
75
76 TP_PROTO(struct task_struct *t),
77
78 TP_ARGS(t),
79
80 TP_STRUCT__entry(
81 __field( pid_t, pid )
82 __field( unsigned int, job )
83 __field( unsigned long long, when )
84 __field( unsigned long long, exec_time )
85 ),
86
87 TP_fast_assign(
88 __entry->pid = is_realtime(t) ? t->pid : 0;
89 __entry->job = is_realtime(t) ? t->rt_param.job_params.job_no : 0;
90 __entry->when = litmus_clock();
91 __entry->exec_time = get_exec_time(t);
92 ),
93
94 TP_printk("switch_to(job(%u, %u)): %Lu (exec: %Lu)\n",
95 __entry->pid, __entry->job,
96 __entry->when, __entry->exec_time)
97);
98
99/*
100 * Tracepoint for switching away previous task
101 */
102TRACE_EVENT(litmus_switch_away,
103
104 TP_PROTO(struct task_struct *t),
105
106 TP_ARGS(t),
107
108 TP_STRUCT__entry(
109 __field( pid_t, pid )
110 __field( unsigned int, job )
111 __field( unsigned long long, when )
112 __field( unsigned long long, exec_time )
113 ),
114
115 TP_fast_assign(
116 __entry->pid = is_realtime(t) ? t->pid : 0;
117 __entry->job = is_realtime(t) ? t->rt_param.job_params.job_no : 0;
118 __entry->when = litmus_clock();
119 __entry->exec_time = get_exec_time(t);
120 ),
121
122 TP_printk("switch_away(job(%u, %u)): %Lu (exec: %Lu)\n",
123 __entry->pid, __entry->job,
124 __entry->when, __entry->exec_time)
125);
126
127/*
128 * Tracing jobs completion
129 */
130TRACE_EVENT(litmus_task_completion,
131
132 TP_PROTO(struct task_struct *t, unsigned long forced),
133
134 TP_ARGS(t, forced),
135
136 TP_STRUCT__entry(
137 __field( pid_t, pid )
138 __field( unsigned int, job )
139 __field( unsigned long long, when )
140 __field( unsigned long, forced )
141 ),
142
143 TP_fast_assign(
144 __entry->pid = t ? t->pid : 0;
145 __entry->job = t ? t->rt_param.job_params.job_no : 0;
146 __entry->when = litmus_clock();
147 __entry->forced = forced;
148 ),
149
150 TP_printk("completed(job(%u, %u)): %Lu (forced: %lu)\n",
151 __entry->pid, __entry->job,
152 __entry->when, __entry->forced)
153);
154
155/*
156 * Trace blocking tasks.
157 */
158TRACE_EVENT(litmus_task_block,
159
160 TP_PROTO(struct task_struct *t, int lid),
161
162 TP_ARGS(t, lid),
163
164 TP_STRUCT__entry(
165 __field( pid_t, pid )
166 __field( int, lid )
167 __field( unsigned long long, when )
168 ),
169
170 TP_fast_assign(
171 __entry->pid = t ? t->pid : 0;
172 __entry->lid = lid;
173 __entry->when = litmus_clock();
174 ),
175
176 TP_printk("(%u) blocks on %d: %Lu\n", __entry->pid,
177 __entry->lid, __entry->when)
178);
179
180/*
181 * Lock events
182 */
183TRACE_EVENT(litmus_resource_acquire,
184
185 TP_PROTO(struct task_struct *t, int lid),
186
187 TP_ARGS(t, lid),
188
189 TP_STRUCT__entry(
190 __field( pid_t, pid )
191 __field( int, lid )
192 __field( unsigned long long, when )
193 ),
194
195 TP_fast_assign(
196 __entry->pid = t ? t->pid : 0;
197 __entry->lid = lid;
198 __entry->when = litmus_clock();
199 ),
200
201 TP_printk("(%u) acquires %d: %Lu\n", __entry->pid,
202 __entry->lid, __entry->when)
203);
204
205TRACE_EVENT(litmus_resource_release,
206
207 TP_PROTO(struct task_struct *t, int lid),
208
209 TP_ARGS(t, lid),
210
211 TP_STRUCT__entry(
212 __field( pid_t, pid )
213 __field( int, lid )
214 __field( unsigned long long, when )
215 ),
216
217 TP_fast_assign(
218 __entry->pid = t ? t->pid : 0;
219 __entry->lid = lid;
220 __entry->when = litmus_clock();
221 ),
222
223 TP_printk("(%u) releases %d: %Lu\n", __entry->pid,
224 __entry->lid, __entry->when)
225);
226
227/*
228 * Tracing jobs resume
229 */
230TRACE_EVENT(litmus_task_resume,
231
232 TP_PROTO(struct task_struct *t, int lid),
233
234 TP_ARGS(t, lid),
235
236 TP_STRUCT__entry(
237 __field( pid_t, pid )
238 __field( int, lid )
239 __field( unsigned int, job )
240 __field( unsigned long long, when )
241 ),
242
243 TP_fast_assign(
244 __entry->pid = t ? t->pid : 0;
245 __entry->job = t ? t->rt_param.job_params.job_no : 0;
246 __entry->when = litmus_clock();
247 __entry->lid = lid;
248 ),
249
250 TP_printk("resume(job(%u, %u)) on %d: %Lu\n",
251 __entry->pid, __entry->job,
252 __entry->lid, __entry->when)
253);
254
255/*
256 * Trace synchronous release
257 */
258TRACE_EVENT(litmus_sys_release,
259
260 TP_PROTO(unsigned long long *start),
261
262 TP_ARGS(start),
263
264 TP_STRUCT__entry(
265 __field( unsigned long long, rel )
266 __field( unsigned long long, when )
267 ),
268
269 TP_fast_assign(
270 __entry->rel = *start;
271 __entry->when = litmus_clock();
272 ),
273
274 TP_printk("SynRelease(%Lu) at %Lu\n", __entry->rel, __entry->when)
275);
276
277/*
278 * Containers
279 */
280TRACE_EVENT(litmus_container_param,
281
282 TP_PROTO(int cid, const char *name),
283
284 TP_ARGS(cid, name),
285
286 TP_STRUCT__entry(
287 __field( int, cid )
288 __array( char, name, TASK_COMM_LEN )
289 ),
290
291 TP_fast_assign(
292 memcpy(__entry->name, name, TASK_COMM_LEN);
293 __entry->cid = cid;
294 ),
295
296 TP_printk("container, name: %s, id: %d\n", __entry->name, __entry->cid)
297);
298
299TRACE_EVENT(litmus_server_param,
300
301 TP_PROTO(int sid, int cid, unsigned long long wcet, unsigned long long period),
302
303 TP_ARGS(sid, cid, wcet, period),
304
305 TP_STRUCT__entry(
306 __field( int, sid )
307 __field( int, cid )
308 __field( unsigned long long, wcet )
309 __field( unsigned long long, period )
310 ),
311
312 TP_fast_assign(
313 __entry->cid = cid;
314 __entry->sid = sid;
315 __entry->wcet = wcet;
316 __entry->period = period;
317 ),
318
319 TP_printk("server(%llu, %llu), sid: %llu, cont: %llu\n",
320 __entry->wcet, __entry->period, __entry->sid, __entry->cid)
321);
322
323TRACE_EVENT(litmus_server_switch_to,
324
325 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob, int cpu),
326
327 TP_ARGS(sid, job, tid, tjob, cpu),
328
329 TP_STRUCT__entry(
330 __field( int, sid)
331 __field( unsigned int, job)
332 __field( int, tid)
333 __field( unsigned int, tjob)
334 __field( int, cpu)
335 ),
336
337 TP_fast_assign(
338 __entry->sid = sid;
339 __entry->tid = tid;
340 __entry->job = job;
341 __entry->tjob = tjob;
342 __entry->cpu = cpu;
343 ),
344
345 TP_printk("switch_to(server(%d, %u)): (%d, %d) on %d\n",
346 __entry->sid, __entry->job, __entry->tid, __entry->tjob, __entry->cpu)
347);
348
349TRACE_EVENT(litmus_server_switch_away,
350
351 TP_PROTO(int sid, unsigned int job, int tid, unsigned int tjob, int cpu),
352
353 TP_ARGS(sid, job, tid, tjob, cpu),
354
355 TP_STRUCT__entry(
356 __field( int, sid)
357 __field( unsigned int, job)
358 __field( int, tid)
359 __field( unsigned int, tjob)
360 __field( int, cpu)
361 ),
362
363 TP_fast_assign(
364 __entry->sid = sid;
365 __entry->tid = tid;
366 __entry->job = job;
367 __entry->tjob = tjob;
368 __entry->cpu = cpu;
369 ),
370
371 TP_printk("switch_away(server(%d, %u)): (%d, %d) on %d\n",
372 __entry->sid, __entry->job, __entry->tid, __entry->tjob, __entry->cpu)
373);
374
375TRACE_EVENT(litmus_server_release,
376
377 TP_PROTO(int sid, unsigned int job,
378 unsigned long long release,
379 unsigned long long deadline),
380
381 TP_ARGS(sid, job, release, deadline),
382
383 TP_STRUCT__entry(
384 __field( int, sid)
385 __field( unsigned int, job)
386 __field( unsigned long long, release)
387 __field( unsigned long long, deadline)
388 ),
389
390 TP_fast_assign(
391 __entry->sid = sid;
392 __entry->job = job;
393 __entry->release = release;
394 __entry->deadline = deadline;
395 ),
396
397 TP_printk("release(server(%d, %u)), release: %llu, deadline: %llu\n",
398 __entry->sid, __entry->job, __entry->release, __entry->deadline)
399);
400
401TRACE_EVENT(litmus_server_completion,
402
403 TP_PROTO(int sid, int job),
404
405 TP_ARGS(sid, job),
406
407 TP_STRUCT__entry(
408 __field( int, sid)
409 __field( unsigned int, job)
410 ),
411
412 TP_fast_assign(
413 __entry->sid = sid;
414 __entry->job = job;
415 ),
416
417 TP_printk("completion(server(%d, %d))\n", __entry->sid, __entry->job)
418);
419
420#endif /* _SCHED_TASK_TRACEPOINT_H */
421
422/* Must stay outside the protection */
423#include <trace/define_trace.h>
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
index 533c49f4804..4d6f3474e8f 100644
--- a/include/trace/ftrace.h
+++ b/include/trace/ftrace.h
@@ -17,6 +17,7 @@
17 */ 17 */
18 18
19#include <linux/ftrace_event.h> 19#include <linux/ftrace_event.h>
20#include <litmus/litmus.h>
20 21
21/* 22/*
22 * DECLARE_EVENT_CLASS can be used to add a generic function 23 * DECLARE_EVENT_CLASS can be used to add a generic function
@@ -54,7 +55,7 @@
54#define __string(item, src) __dynamic_array(char, item, -1) 55#define __string(item, src) __dynamic_array(char, item, -1)
55 56
56#undef TP_STRUCT__entry 57#undef TP_STRUCT__entry
57#define TP_STRUCT__entry(args...) args 58#define TP_STRUCT__entry(args...) args __field( unsigned long long, __rt_ts )
58 59
59#undef DECLARE_EVENT_CLASS 60#undef DECLARE_EVENT_CLASS
60#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ 61#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \
@@ -507,7 +508,7 @@ static inline notrace int ftrace_get_offsets_##call( \
507 strcpy(__get_str(dst), src); 508 strcpy(__get_str(dst), src);
508 509
509#undef TP_fast_assign 510#undef TP_fast_assign
510#define TP_fast_assign(args...) args 511#define TP_fast_assign(args...) args; __entry->__rt_ts = litmus_clock();
511 512
512#undef TP_perf_assign 513#undef TP_perf_assign
513#define TP_perf_assign(args...) 514#define TP_perf_assign(args...)