aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/litmus/litmus.h2
-rw-r--r--include/litmus/locking.h1
-rw-r--r--include/litmus/rt_param.h2
-rw-r--r--include/litmus/sched_plugin.h5
-rw-r--r--include/litmus/sched_trace.h60
-rw-r--r--include/trace/events/litmus.h232
-rw-r--r--include/trace/ftrace.h5
7 files changed, 274 insertions, 33 deletions
diff --git a/include/litmus/litmus.h b/include/litmus/litmus.h
index 0b071fd359f9..2776470bb897 100644
--- a/include/litmus/litmus.h
+++ b/include/litmus/litmus.h
@@ -44,6 +44,8 @@ void litmus_exit_task(struct task_struct *tsk);
44 44
45#define tsk_rt(t) (&(t)->rt_param) 45#define tsk_rt(t) (&(t)->rt_param)
46 46
47#define get_server_job(t) (tsk_rt(t)->job_params.fake_job_no)
48
47/* Realtime utility macros */ 49/* Realtime utility macros */
48#define get_rt_flags(t) (tsk_rt(t)->flags) 50#define get_rt_flags(t) (tsk_rt(t)->flags)
49#define set_rt_flags(t,f) (tsk_rt(t)->flags=(f)) 51#define set_rt_flags(t,f) (tsk_rt(t)->flags=(f))
diff --git a/include/litmus/locking.h b/include/litmus/locking.h
index 4d7b870cb443..41991d5af01b 100644
--- a/include/litmus/locking.h
+++ b/include/litmus/locking.h
@@ -9,6 +9,7 @@ struct litmus_lock_ops;
9struct litmus_lock { 9struct litmus_lock {
10 struct litmus_lock_ops *ops; 10 struct litmus_lock_ops *ops;
11 int type; 11 int type;
12 int id;
12}; 13};
13 14
14struct litmus_lock_ops { 15struct litmus_lock_ops {
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h
index d6d799174160..ba62e10d6f2c 100644
--- a/include/litmus/rt_param.h
+++ b/include/litmus/rt_param.h
@@ -89,7 +89,7 @@ struct rt_job {
89 lt_t exec_time; 89 lt_t exec_time;
90 90
91 /* Which job is this. This is used to let user space 91 /* Which job is this. This is used to let user space
92 * specify which job to wait for, which is important if jobs 92yes * specify which job to wait for, which is important if jobs
93 * overrun. If we just call sys_sleep_next_period() then we 93 * overrun. If we just call sys_sleep_next_period() then we
94 * will unintentionally miss jobs after an overrun. 94 * will unintentionally miss jobs after an overrun.
95 * 95 *
diff --git a/include/litmus/sched_plugin.h b/include/litmus/sched_plugin.h
index 6e7cabdddae8..01786b57a4a9 100644
--- a/include/litmus/sched_plugin.h
+++ b/include/litmus/sched_plugin.h
@@ -67,6 +67,9 @@ typedef long (*admit_task_t)(struct task_struct* tsk);
67 67
68typedef void (*release_at_t)(struct task_struct *t, lt_t start); 68typedef void (*release_at_t)(struct task_struct *t, lt_t start);
69 69
70/* TODO remove me */
71typedef void (*release_ts_t)(lt_t time);
72
70struct sched_plugin { 73struct sched_plugin {
71 struct list_head list; 74 struct list_head list;
72 /* basic info */ 75 /* basic info */
@@ -93,6 +96,8 @@ struct sched_plugin {
93 task_block_t task_block; 96 task_block_t task_block;
94 task_exit_t task_exit; 97 task_exit_t task_exit;
95 98
99 release_ts_t release_ts;
100
96#ifdef CONFIG_LITMUS_LOCKING 101#ifdef CONFIG_LITMUS_LOCKING
97 /* locking protocols */ 102 /* locking protocols */
98 allocate_lock_t allocate_lock; 103 allocate_lock_t allocate_lock;
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h
index 82bde8241298..49972d75ef38 100644
--- a/include/litmus/sched_trace.h
+++ b/include/litmus/sched_trace.h
@@ -180,6 +180,13 @@ feather_callback void do_sched_trace_sys_release(unsigned long id,
180#define trace_litmus_task_resume(t) 180#define trace_litmus_task_resume(t)
181#define trace_litmus_sys_release(start) 181#define trace_litmus_sys_release(start)
182 182
183#define trace_litmus_container_param(cid, name)
184#define trace_litmus_server_param(sid, cid, wcet, time)
185#define trace_litmus_server_switch_to(sid, job, tid)
186#define trace_litmus_server_switch_away(sid, job, tid)
187#define trace_litmus_server_release(sid, job, release, deadline)
188#define trace_litmus_server_completion(sid, job)
189
183#endif 190#endif
184 191
185 192
@@ -226,18 +233,28 @@ feather_callback void do_sched_trace_sys_release(unsigned long id,
226 trace_litmus_task_completion(t, forced); \ 233 trace_litmus_task_completion(t, forced); \
227 } while (0) 234 } while (0)
228 235
229#define sched_trace_task_block(t) \ 236#define sched_trace_task_block(t, i) \
230 do { \ 237 do { \
231 SCHED_TRACE(SCHED_TRACE_BASE_ID + 7, \ 238 SCHED_TRACE(SCHED_TRACE_BASE_ID + 7, \
232 do_sched_trace_task_block, t); \ 239 do_sched_trace_task_block, t); \
233 trace_litmus_task_block(t); \ 240 trace_litmus_task_block(t, i); \
234 } while (0) 241 } while (0)
235 242
236#define sched_trace_task_resume(t) \ 243#define sched_trace_task_resume(t, i) \
237 do { \ 244 do { \
238 SCHED_TRACE(SCHED_TRACE_BASE_ID + 8, \ 245 SCHED_TRACE(SCHED_TRACE_BASE_ID + 8, \
239 do_sched_trace_task_resume, t); \ 246 do_sched_trace_task_resume, t); \
240 trace_litmus_task_resume(t); \ 247 trace_litmus_task_resume(t, i); \
248 } while (0)
249
250#define sched_trace_resource_acquire(t, i) \
251 do { \
252 trace_litmus_resource_acquire(t, i); \
253 } while (0)
254
255#define sched_trace_resource_released(t, i) \
256 do { \
257 trace_litmus_resource_released(t, i); \
241 } while (0) 258 } while (0)
242 259
243#define sched_trace_action(t, action) \ 260#define sched_trace_action(t, action) \
@@ -252,6 +269,41 @@ feather_callback void do_sched_trace_sys_release(unsigned long id,
252 trace_litmus_sys_release(when); \ 269 trace_litmus_sys_release(when); \
253 } while (0) 270 } while (0)
254 271
272#define QT_START lt_t _qt_start = litmus_clock()
273#define QT_END \
274 sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \
275 TRACE_ARGS, litmus_clock() - _qt_start)
276
277#define sched_trace_container_param(cid, name) \
278 do { \
279 trace_litmus_container_param(cid, name); \
280 } while (0)
281
282#define sched_trace_server_param(sid, cid, wcet, period) \
283 do { \
284 trace_litmus_server_param(sid, cid, wcet, period); \
285 } while(0)
286
287#define sched_trace_server_switch_to(sid, job, tid) \
288 do { \
289 trace_litmus_server_switch_to(sid, job, tid); \
290 } while(0)
291
292#define sched_trace_server_switch_away(sid, job, tid) \
293 do { \
294 trace_litmus_server_switch_away(sid, job, tid); \
295 } while (0)
296
297#define sched_trace_server_release(sid, job, rel, dead) \
298 do { \
299 trace_litmus_server_release(sid, job, rel, dead); \
300 } while (0)
301
302#define sched_trace_server_completion(sid, job) \
303 do { \
304 trace_litmus_server_completion(sid, job); \
305 } while (0)
306
255#define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ 307#define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */
256 308
257#endif /* __KERNEL__ */ 309#endif /* __KERNEL__ */
diff --git a/include/trace/events/litmus.h b/include/trace/events/litmus.h
index 0fffcee02be0..b3a8f166e65f 100644
--- a/include/trace/events/litmus.h
+++ b/include/trace/events/litmus.h
@@ -11,10 +11,6 @@
11 11
12#include <litmus/litmus.h> 12#include <litmus/litmus.h>
13#include <litmus/rt_param.h> 13#include <litmus/rt_param.h>
14
15/*
16 * Tracing task admission
17 */
18TRACE_EVENT(litmus_task_param, 14TRACE_EVENT(litmus_task_param,
19 15
20 TP_PROTO(struct task_struct *t), 16 TP_PROTO(struct task_struct *t),
@@ -24,9 +20,9 @@ TRACE_EVENT(litmus_task_param,
24 TP_STRUCT__entry( 20 TP_STRUCT__entry(
25 __field( pid_t, pid ) 21 __field( pid_t, pid )
26 __field( unsigned int, job ) 22 __field( unsigned int, job )
27 __field( lt_t, wcet ) 23 __field( unsigned long long, wcet )
28 __field( lt_t, period ) 24 __field( unsigned long long, period )
29 __field( lt_t, phase ) 25 __field( unsigned long long, phase )
30 __field( int, partition ) 26 __field( int, partition )
31 ), 27 ),
32 28
@@ -56,8 +52,8 @@ TRACE_EVENT(litmus_task_release,
56 TP_STRUCT__entry( 52 TP_STRUCT__entry(
57 __field( pid_t, pid ) 53 __field( pid_t, pid )
58 __field( unsigned int, job ) 54 __field( unsigned int, job )
59 __field( lt_t, release ) 55 __field( unsigned long long, release )
60 __field( lt_t, deadline ) 56 __field( unsigned long long, deadline )
61 ), 57 ),
62 58
63 TP_fast_assign( 59 TP_fast_assign(
@@ -84,8 +80,8 @@ TRACE_EVENT(litmus_switch_to,
84 TP_STRUCT__entry( 80 TP_STRUCT__entry(
85 __field( pid_t, pid ) 81 __field( pid_t, pid )
86 __field( unsigned int, job ) 82 __field( unsigned int, job )
87 __field( lt_t, when ) 83 __field( unsigned long long, when )
88 __field( lt_t, exec_time ) 84 __field( unsigned long long, exec_time )
89 ), 85 ),
90 86
91 TP_fast_assign( 87 TP_fast_assign(
@@ -112,8 +108,8 @@ TRACE_EVENT(litmus_switch_away,
112 TP_STRUCT__entry( 108 TP_STRUCT__entry(
113 __field( pid_t, pid ) 109 __field( pid_t, pid )
114 __field( unsigned int, job ) 110 __field( unsigned int, job )
115 __field( lt_t, when ) 111 __field( unsigned long long, when )
116 __field( lt_t, exec_time ) 112 __field( unsigned long long, exec_time )
117 ), 113 ),
118 114
119 TP_fast_assign( 115 TP_fast_assign(
@@ -140,7 +136,7 @@ TRACE_EVENT(litmus_task_completion,
140 TP_STRUCT__entry( 136 TP_STRUCT__entry(
141 __field( pid_t, pid ) 137 __field( pid_t, pid )
142 __field( unsigned int, job ) 138 __field( unsigned int, job )
143 __field( lt_t, when ) 139 __field( unsigned long long, when )
144 __field( unsigned long, forced ) 140 __field( unsigned long, forced )
145 ), 141 ),
146 142
@@ -161,21 +157,71 @@ TRACE_EVENT(litmus_task_completion,
161 */ 157 */
162TRACE_EVENT(litmus_task_block, 158TRACE_EVENT(litmus_task_block,
163 159
164 TP_PROTO(struct task_struct *t), 160 TP_PROTO(struct task_struct *t, int lid),
165 161
166 TP_ARGS(t), 162 TP_ARGS(t, lid),
167 163
168 TP_STRUCT__entry( 164 TP_STRUCT__entry(
169 __field( pid_t, pid ) 165 __field( pid_t, pid )
170 __field( lt_t, when ) 166 __field( int, lid )
167 __field( unsigned long long, when )
171 ), 168 ),
172 169
173 TP_fast_assign( 170 TP_fast_assign(
174 __entry->pid = t ? t->pid : 0; 171 __entry->pid = t ? t->pid : 0;
172 __entry->lid = lid;
175 __entry->when = litmus_clock(); 173 __entry->when = litmus_clock();
176 ), 174 ),
177 175
178 TP_printk("(%u) blocks: %Lu\n", __entry->pid, __entry->when) 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)
179); 225);
180 226
181/* 227/*
@@ -183,24 +229,27 @@ TRACE_EVENT(litmus_task_block,
183 */ 229 */
184TRACE_EVENT(litmus_task_resume, 230TRACE_EVENT(litmus_task_resume,
185 231
186 TP_PROTO(struct task_struct *t), 232 TP_PROTO(struct task_struct *t, int lid),
187 233
188 TP_ARGS(t), 234 TP_ARGS(t, lid),
189 235
190 TP_STRUCT__entry( 236 TP_STRUCT__entry(
191 __field( pid_t, pid ) 237 __field( pid_t, pid )
238 __field( int, lid )
192 __field( unsigned int, job ) 239 __field( unsigned int, job )
193 __field( lt_t, when ) 240 __field( unsigned long long, when )
194 ), 241 ),
195 242
196 TP_fast_assign( 243 TP_fast_assign(
197 __entry->pid = t ? t->pid : 0; 244 __entry->pid = t ? t->pid : 0;
198 __entry->job = t ? t->rt_param.job_params.job_no : 0; 245 __entry->job = t ? t->rt_param.job_params.job_no : 0;
199 __entry->when = litmus_clock(); 246 __entry->when = litmus_clock();
247 __entry->lid = lid;
200 ), 248 ),
201 249
202 TP_printk("resume(job(%u, %u)): %Lu\n", 250 TP_printk("resume(job(%u, %u)) on %d: %Lu\n",
203 __entry->pid, __entry->job, __entry->when) 251 __entry->pid, __entry->job,
252 __entry->lid, __entry->when)
204); 253);
205 254
206/* 255/*
@@ -208,13 +257,13 @@ TRACE_EVENT(litmus_task_resume,
208 */ 257 */
209TRACE_EVENT(litmus_sys_release, 258TRACE_EVENT(litmus_sys_release,
210 259
211 TP_PROTO(lt_t *start), 260 TP_PROTO(unsigned long long *start),
212 261
213 TP_ARGS(start), 262 TP_ARGS(start),
214 263
215 TP_STRUCT__entry( 264 TP_STRUCT__entry(
216 __field( lt_t, rel ) 265 __field( unsigned long long, rel )
217 __field( lt_t, when ) 266 __field( unsigned long long, when )
218 ), 267 ),
219 268
220 TP_fast_assign( 269 TP_fast_assign(
@@ -225,6 +274,137 @@ TRACE_EVENT(litmus_sys_release,
225 TP_printk("SynRelease(%Lu) at %Lu\n", __entry->rel, __entry->when) 274 TP_printk("SynRelease(%Lu) at %Lu\n", __entry->rel, __entry->when)
226); 275);
227 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),
326
327 TP_ARGS(sid, job, tid),
328
329 TP_STRUCT__entry(
330 __field( int, sid)
331 __field( unsigned int, job)
332 __field( int, tid)
333 ),
334
335 TP_fast_assign(
336 __entry->sid = sid;
337 __entry->tid = tid;
338 __entry->job = job;
339 ),
340
341 TP_printk("switch_to(server(%d, %u)): %d\n", __entry->sid, __entry->job, __entry->tid)
342);
343
344TRACE_EVENT(litmus_server_switch_away,
345
346 TP_PROTO(int sid, unsigned int job, int tid),
347
348 TP_ARGS(sid, job, tid),
349
350 TP_STRUCT__entry(
351 __field( int, sid)
352 __field( unsigned int, job)
353 __field( int, tid)
354 ),
355
356 TP_fast_assign(
357 __entry->sid = sid;
358 __entry->tid = tid;
359 ),
360
361 TP_printk("switch_away(server(%d, %u)): %d\n", __entry->sid, __entry->job, __entry->tid)
362);
363
364TRACE_EVENT(litmus_server_release,
365
366 TP_PROTO(int sid, unsigned int job,
367 unsigned long long release,
368 unsigned long long deadline),
369
370 TP_ARGS(sid, job, release, deadline),
371
372 TP_STRUCT__entry(
373 __field( int, sid)
374 __field( unsigned int, job)
375 __field( unsigned long long, release)
376 __field( unsigned long long, deadline)
377 ),
378
379 TP_fast_assign(
380 __entry->sid = sid;
381 __entry->job = job;
382 __entry->release = release;
383 __entry->deadline = deadline;
384 ),
385
386 TP_printk("release(server(%d, %u)), release: %llu, deadline: %llu\n", __entry->sid, __entry->job, __entry->release, __entry->deadline)
387);
388
389TRACE_EVENT(litmus_server_completion,
390
391 TP_PROTO(int sid, int job),
392
393 TP_ARGS(sid, job),
394
395 TP_STRUCT__entry(
396 __field( int, sid)
397 __field( unsigned int, job)
398 ),
399
400 TP_fast_assign(
401 __entry->sid = sid;
402 __entry->job = job;
403 ),
404
405 TP_printk("completion(server(%d, %d))\n", __entry->sid, __entry->job)
406);
407
228#endif /* _SCHED_TASK_TRACEPOINT_H */ 408#endif /* _SCHED_TASK_TRACEPOINT_H */
229 409
230/* Must stay outside the protection */ 410/* Must stay outside the protection */
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h
index 533c49f48047..4d6f3474e8fa 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...)