From 63fabd87c18d0da2d727ae79ae864d6064f9e7e0 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Fri, 21 Sep 2012 14:15:30 -0400 Subject: Initial commit --- include/litmus/sched_trace.h | 66 +++++++++++- include/trace/events/litmus.h | 232 +++++++++++++++++++++++++++++++++++++----- include/trace/ftrace.h | 5 +- 3 files changed, 271 insertions(+), 32 deletions(-) diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index 82bde824129..adc223e9c8a 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, #define trace_litmus_task_resume(t) #define trace_litmus_sys_release(start) +#define trace_litmus_container_param(cid, name) +#define trace_litmus_server_param(sid, cid, wcet, time) +#define trace_litmus_server_switch_to(sid, job, tid) +#define trace_litmus_server_switch_away(sid, job, tid) +#define trace_litmus_server_release(sid, job, release, deadline) +#define trace_litmus_server_completion(sid, job) + #endif @@ -226,18 +233,34 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, trace_litmus_task_completion(t, forced); \ } while (0) -#define sched_trace_task_block(t) \ +#define sched_trace_task_block_on(t, i) \ do { \ SCHED_TRACE(SCHED_TRACE_BASE_ID + 7, \ do_sched_trace_task_block, t); \ - trace_litmus_task_block(t); \ + trace_litmus_task_block(t, i); \ } while (0) -#define sched_trace_task_resume(t) \ +#define sched_trace_task_block(t) \ + sched_trace_task_block_on(t, 0) + +#define sched_trace_task_resume_on(t, i) \ do { \ SCHED_TRACE(SCHED_TRACE_BASE_ID + 8, \ do_sched_trace_task_resume, t); \ - trace_litmus_task_resume(t); \ + trace_litmus_task_resume(t, i); \ + } while (0) + +#define sched_trace_task_resume(t) \ + sched_trace_task_resume_on(t, 0) + +#define sched_trace_resource_acquire(t, i) \ + do { \ + trace_litmus_resource_acquire(t, i); \ + } while (0) + +#define sched_trace_resource_released(t, i) \ + do { \ + trace_litmus_resource_released(t, i); \ } while (0) #define sched_trace_action(t, action) \ @@ -252,6 +275,41 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, trace_litmus_sys_release(when); \ } while (0) +#define QT_START lt_t _qt_start = litmus_clock() +#define QT_END \ + sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \ + TRACE_ARGS, litmus_clock() - _qt_start) + +#define sched_trace_container_param(cid, name) \ + do { \ + trace_litmus_container_param(cid, name); \ + } while (0) + +#define sched_trace_server_param(sid, cid, wcet, period) \ + do { \ + trace_litmus_server_param(sid, cid, wcet, period); \ + } while(0) + +#define sched_trace_server_switch_to(sid, job, tid) \ + do { \ + trace_litmus_server_switch_to(sid, job, tid); \ + } while(0) + +#define sched_trace_server_switch_away(sid, job, tid) \ + do { \ + trace_litmus_server_switch_away(sid, job, tid); \ + } while (0) + +#define sched_trace_server_release(sid, job, rel, dead) \ + do { \ + trace_litmus_server_release(sid, job, rel, dead); \ + } while (0) + +#define sched_trace_server_completion(sid, job) \ + do { \ + trace_litmus_server_completion(sid, job); \ + } while (0) + #define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ #endif /* __KERNEL__ */ diff --git a/include/trace/events/litmus.h b/include/trace/events/litmus.h index 0fffcee02be..b3a8f166e65 100644 --- a/include/trace/events/litmus.h +++ b/include/trace/events/litmus.h @@ -11,10 +11,6 @@ #include #include - -/* - * Tracing task admission - */ TRACE_EVENT(litmus_task_param, TP_PROTO(struct task_struct *t), @@ -24,9 +20,9 @@ TRACE_EVENT(litmus_task_param, TP_STRUCT__entry( __field( pid_t, pid ) __field( unsigned int, job ) - __field( lt_t, wcet ) - __field( lt_t, period ) - __field( lt_t, phase ) + __field( unsigned long long, wcet ) + __field( unsigned long long, period ) + __field( unsigned long long, phase ) __field( int, partition ) ), @@ -56,8 +52,8 @@ TRACE_EVENT(litmus_task_release, TP_STRUCT__entry( __field( pid_t, pid ) __field( unsigned int, job ) - __field( lt_t, release ) - __field( lt_t, deadline ) + __field( unsigned long long, release ) + __field( unsigned long long, deadline ) ), TP_fast_assign( @@ -84,8 +80,8 @@ TRACE_EVENT(litmus_switch_to, TP_STRUCT__entry( __field( pid_t, pid ) __field( unsigned int, job ) - __field( lt_t, when ) - __field( lt_t, exec_time ) + __field( unsigned long long, when ) + __field( unsigned long long, exec_time ) ), TP_fast_assign( @@ -112,8 +108,8 @@ TRACE_EVENT(litmus_switch_away, TP_STRUCT__entry( __field( pid_t, pid ) __field( unsigned int, job ) - __field( lt_t, when ) - __field( lt_t, exec_time ) + __field( unsigned long long, when ) + __field( unsigned long long, exec_time ) ), TP_fast_assign( @@ -140,7 +136,7 @@ TRACE_EVENT(litmus_task_completion, TP_STRUCT__entry( __field( pid_t, pid ) __field( unsigned int, job ) - __field( lt_t, when ) + __field( unsigned long long, when ) __field( unsigned long, forced ) ), @@ -161,21 +157,71 @@ TRACE_EVENT(litmus_task_completion, */ TRACE_EVENT(litmus_task_block, - TP_PROTO(struct task_struct *t), + TP_PROTO(struct task_struct *t, int lid), - TP_ARGS(t), + TP_ARGS(t, lid), TP_STRUCT__entry( __field( pid_t, pid ) - __field( lt_t, when ) + __field( int, lid ) + __field( unsigned long long, when ) ), TP_fast_assign( __entry->pid = t ? t->pid : 0; + __entry->lid = lid; __entry->when = litmus_clock(); ), - TP_printk("(%u) blocks: %Lu\n", __entry->pid, __entry->when) + TP_printk("(%u) blocks on %d: %Lu\n", __entry->pid, + __entry->lid, __entry->when) +); + +/* + * Lock events + */ +TRACE_EVENT(litmus_resource_acquire, + + TP_PROTO(struct task_struct *t, int lid), + + TP_ARGS(t, lid), + + TP_STRUCT__entry( + __field( pid_t, pid ) + __field( int, lid ) + __field( unsigned long long, when ) + ), + + TP_fast_assign( + __entry->pid = t ? t->pid : 0; + __entry->lid = lid; + __entry->when = litmus_clock(); + ), + + TP_printk("(%u) acquires %d: %Lu\n", __entry->pid, + __entry->lid, __entry->when) +); + +TRACE_EVENT(litmus_resource_release, + + TP_PROTO(struct task_struct *t, int lid), + + TP_ARGS(t, lid), + + TP_STRUCT__entry( + __field( pid_t, pid ) + __field( int, lid ) + __field( unsigned long long, when ) + ), + + TP_fast_assign( + __entry->pid = t ? t->pid : 0; + __entry->lid = lid; + __entry->when = litmus_clock(); + ), + + TP_printk("(%u) releases %d: %Lu\n", __entry->pid, + __entry->lid, __entry->when) ); /* @@ -183,24 +229,27 @@ TRACE_EVENT(litmus_task_block, */ TRACE_EVENT(litmus_task_resume, - TP_PROTO(struct task_struct *t), + TP_PROTO(struct task_struct *t, int lid), - TP_ARGS(t), + TP_ARGS(t, lid), TP_STRUCT__entry( __field( pid_t, pid ) + __field( int, lid ) __field( unsigned int, job ) - __field( lt_t, when ) + __field( unsigned long long, when ) ), TP_fast_assign( __entry->pid = t ? t->pid : 0; __entry->job = t ? t->rt_param.job_params.job_no : 0; __entry->when = litmus_clock(); + __entry->lid = lid; ), - TP_printk("resume(job(%u, %u)): %Lu\n", - __entry->pid, __entry->job, __entry->when) + TP_printk("resume(job(%u, %u)) on %d: %Lu\n", + __entry->pid, __entry->job, + __entry->lid, __entry->when) ); /* @@ -208,13 +257,13 @@ TRACE_EVENT(litmus_task_resume, */ TRACE_EVENT(litmus_sys_release, - TP_PROTO(lt_t *start), + TP_PROTO(unsigned long long *start), TP_ARGS(start), TP_STRUCT__entry( - __field( lt_t, rel ) - __field( lt_t, when ) + __field( unsigned long long, rel ) + __field( unsigned long long, when ) ), TP_fast_assign( @@ -225,6 +274,137 @@ TRACE_EVENT(litmus_sys_release, TP_printk("SynRelease(%Lu) at %Lu\n", __entry->rel, __entry->when) ); +/* + * Containers + */ +TRACE_EVENT(litmus_container_param, + + TP_PROTO(int cid, const char *name), + + TP_ARGS(cid, name), + + TP_STRUCT__entry( + __field( int, cid ) + __array( char, name, TASK_COMM_LEN ) + ), + + TP_fast_assign( + memcpy(__entry->name, name, TASK_COMM_LEN); + __entry->cid = cid; + ), + + TP_printk("container, name: %s, id: %d\n", __entry->name, __entry->cid) +); + +TRACE_EVENT(litmus_server_param, + + TP_PROTO(int sid, int cid, unsigned long long wcet, unsigned long long period), + + TP_ARGS(sid, cid, wcet, period), + + TP_STRUCT__entry( + __field( int, sid ) + __field( int, cid ) + __field( unsigned long long, wcet ) + __field( unsigned long long, period ) + ), + + TP_fast_assign( + __entry->cid = cid; + __entry->sid = sid; + __entry->wcet = wcet; + __entry->period = period; + ), + + TP_printk("server(%llu, %llu), sid: %llu, cont: %llu\n", + __entry->wcet, __entry->period, __entry->sid, __entry->cid) +); + +TRACE_EVENT(litmus_server_switch_to, + + TP_PROTO(int sid, unsigned int job, int tid), + + TP_ARGS(sid, job, tid), + + TP_STRUCT__entry( + __field( int, sid) + __field( unsigned int, job) + __field( int, tid) + ), + + TP_fast_assign( + __entry->sid = sid; + __entry->tid = tid; + __entry->job = job; + ), + + TP_printk("switch_to(server(%d, %u)): %d\n", __entry->sid, __entry->job, __entry->tid) +); + +TRACE_EVENT(litmus_server_switch_away, + + TP_PROTO(int sid, unsigned int job, int tid), + + TP_ARGS(sid, job, tid), + + TP_STRUCT__entry( + __field( int, sid) + __field( unsigned int, job) + __field( int, tid) + ), + + TP_fast_assign( + __entry->sid = sid; + __entry->tid = tid; + ), + + TP_printk("switch_away(server(%d, %u)): %d\n", __entry->sid, __entry->job, __entry->tid) +); + +TRACE_EVENT(litmus_server_release, + + TP_PROTO(int sid, unsigned int job, + unsigned long long release, + unsigned long long deadline), + + TP_ARGS(sid, job, release, deadline), + + TP_STRUCT__entry( + __field( int, sid) + __field( unsigned int, job) + __field( unsigned long long, release) + __field( unsigned long long, deadline) + ), + + TP_fast_assign( + __entry->sid = sid; + __entry->job = job; + __entry->release = release; + __entry->deadline = deadline; + ), + + TP_printk("release(server(%d, %u)), release: %llu, deadline: %llu\n", __entry->sid, __entry->job, __entry->release, __entry->deadline) +); + +TRACE_EVENT(litmus_server_completion, + + TP_PROTO(int sid, int job), + + TP_ARGS(sid, job), + + TP_STRUCT__entry( + __field( int, sid) + __field( unsigned int, job) + ), + + TP_fast_assign( + __entry->sid = sid; + __entry->job = job; + ), + + TP_printk("completion(server(%d, %d))\n", __entry->sid, __entry->job) +); + #endif /* _SCHED_TASK_TRACEPOINT_H */ /* Must stay outside the protection */ 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 @@ */ #include +#include /* * DECLARE_EVENT_CLASS can be used to add a generic function @@ -54,7 +55,7 @@ #define __string(item, src) __dynamic_array(char, item, -1) #undef TP_STRUCT__entry -#define TP_STRUCT__entry(args...) args +#define TP_STRUCT__entry(args...) args __field( unsigned long long, __rt_ts ) #undef DECLARE_EVENT_CLASS #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \ @@ -507,7 +508,7 @@ static inline notrace int ftrace_get_offsets_##call( \ strcpy(__get_str(dst), src); #undef TP_fast_assign -#define TP_fast_assign(args...) args +#define TP_fast_assign(args...) args; __entry->__rt_ts = litmus_clock(); #undef TP_perf_assign #define TP_perf_assign(args...) -- cgit v1.2.2 From 45d0f315ec64bdac3ba0723be07e83b7df7652f8 Mon Sep 17 00:00:00 2001 From: Christopher Kenna Date: Sun, 6 May 2012 21:18:33 -0400 Subject: Add task_exit event that records max exec time under color plugin. Conflicts: include/litmus/rt_param.h litmus/sched_color.c --- include/litmus/rt_param.h | 2 ++ include/litmus/sched_trace.h | 19 ++++++++++++++++++- include/trace/events/litmus.h | 22 ++++++++++++++++++++++ litmus/sched_task_trace.c | 13 +++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index fac939dbd33..d84248828cf 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h @@ -225,6 +225,8 @@ struct rt_param { /* Pointer to the page shared between userspace and kernel. */ struct control_page * ctrl_page; + + lt_t max_exec_time; }; /* Possible RT flags */ diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index adc223e9c8a..098df065317 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -80,6 +80,11 @@ struct st_sys_release_data { u64 release; }; +struct st_task_exit_data { + u64 max_exec_time; + u64 __unused; +}; + #define DATA(x) struct st_ ## x ## _data x; typedef enum { @@ -94,7 +99,8 @@ typedef enum { ST_BLOCK, ST_RESUME, ST_ACTION, - ST_SYS_RELEASE + ST_SYS_RELEASE, + ST_TASK_EXIT, } st_event_record_type_t; struct st_event_record { @@ -113,6 +119,7 @@ struct st_event_record { DATA(resume); DATA(action); DATA(sys_release); + DATA(task_exit); } data; }; @@ -154,6 +161,8 @@ feather_callback void do_sched_trace_action(unsigned long id, unsigned long action); feather_callback void do_sched_trace_sys_release(unsigned long id, lt_t* start); +feather_callback void do_sched_trace_task_exit(unsigned long id, + struct task_struct* task); #endif @@ -179,6 +188,7 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, #define trace_litmus_task_block(t) #define trace_litmus_task_resume(t) #define trace_litmus_sys_release(start) +#define trace_litmus_task_exit(t) #define trace_litmus_container_param(cid, name) #define trace_litmus_server_param(sid, cid, wcet, time) @@ -275,6 +285,13 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, trace_litmus_sys_release(when); \ } while (0) +#define sched_trace_task_exit(t) \ + do { \ + SCHED_TRACE(SCHED_TRACE_BASE_ID + 11, \ + do_sched_trace_task_exit, t); \ + trace_litmus_task_exit(t); \ + } while (0) + #define QT_START lt_t _qt_start = litmus_clock() #define QT_END \ sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \ diff --git a/include/trace/events/litmus.h b/include/trace/events/litmus.h index b3a8f166e65..c3a92f8ec6e 100644 --- a/include/trace/events/litmus.h +++ b/include/trace/events/litmus.h @@ -274,6 +274,28 @@ TRACE_EVENT(litmus_sys_release, TP_printk("SynRelease(%Lu) at %Lu\n", __entry->rel, __entry->when) ); +/* + * Trace task exit + */ +TRACE_EVENT(litmus_task_exit, + + TP_PROTO(struct task_struct *t), + + TP_ARGS(t), + + TP_STRUCT__entry( + __field( pid_t, pid ) + __field( unsigned long long, max_exec_time ) + ), + + TP_fast_assign( + __entry->pid = t ? t->pid : 0; + __entry->max_exec_time = t ? t->rt_param.max_exec_time : 0; + ), + + TP_printk("(%u) exit\n", __entry->pid) +); + /* * Containers */ diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 5ef8d09ab41..d2ece6b764b 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -226,6 +226,19 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, } } +feather_callback void do_sched_trace_task_exit(unsigned long id, + unsigned long _task) +{ + struct task_struct *t = (struct task_struct*) _task; + const lt_t max_exec_time = tsk_rt(t)->max_exec_time; + + struct st_event_record *rec = get_record(ST_TASK_EXIT, t); + if (rec) { + rec->data.task_exit.max_exec_time = max_exec_time; + put_record(rec); + } +} + feather_callback void do_sched_trace_action(unsigned long id, unsigned long _task, unsigned long action) -- cgit v1.2.2 From f299a6944bfdfe70ddc8b9993f1ec3eb5d18d796 Mon Sep 17 00:00:00 2001 From: Christopher Kenna Date: Sun, 6 May 2012 21:37:20 -0400 Subject: Add the time to the task_exit event --- include/litmus/sched_trace.h | 2 +- litmus/sched_task_trace.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index 098df065317..c71a08ab552 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -81,8 +81,8 @@ struct st_sys_release_data { }; struct st_task_exit_data { + u64 when; u64 max_exec_time; - u64 __unused; }; #define DATA(x) struct st_ ## x ## _data x; diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index d2ece6b764b..4ada33c6979 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -234,6 +234,7 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, struct st_event_record *rec = get_record(ST_TASK_EXIT, t); if (rec) { + rec->data.task_exit.when = now(); rec->data.task_exit.max_exec_time = max_exec_time; put_record(rec); } -- cgit v1.2.2 From 2821fbab349aa7a7846f3a9a226988c38969fa38 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Wed, 9 May 2012 17:11:56 -0400 Subject: Track tasks average execution time, drop in TASK_EXIT record Conflicts: include/litmus/rt_param.h litmus/jobs.c litmus/sched_color.c litmus/sched_task_trace.c --- include/litmus/rt_param.h | 1 + include/litmus/sched_trace.h | 2 +- litmus/jobs.c | 11 ++++++----- litmus/sched_task_trace.c | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index d84248828cf..8c996b91ead 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h @@ -227,6 +227,7 @@ struct rt_param { struct control_page * ctrl_page; lt_t max_exec_time; + lt_t tot_exec_time; }; /* Possible RT flags */ diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index c71a08ab552..f910c63c067 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -81,7 +81,7 @@ struct st_sys_release_data { }; struct st_task_exit_data { - u64 when; + u64 avg_exec_time; u64 max_exec_time; }; diff --git a/litmus/jobs.c b/litmus/jobs.c index fb093c03d53..50728a416c6 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c @@ -8,13 +8,14 @@ static inline void setup_release(struct task_struct *t, lt_t release) { - /* prepare next release */ - t->rt_param.job_params.release = release; - t->rt_param.job_params.deadline = release + get_rt_relative_deadline(t); - t->rt_param.job_params.exec_time = 0; + tsk_rt(t)->tot_exec_time += tsk_rt(t)->job_params.exec_time; + /* prepare next release */ + tsk_rt(t)->job_params.release = tsk_rt(t)->job_params.deadline; + tsk_rt(t)->job_params.deadline += get_rt_period(t); + tsk_rt(t)->job_params.exec_time = 0; /* update job sequence number */ - t->rt_param.job_params.job_no++; + tsk_rt(t)->job_params.job_no++; /* don't confuse Linux */ t->rt.time_slice = 1; diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 4ada33c6979..73ce4df517e 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -231,10 +231,11 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, { struct task_struct *t = (struct task_struct*) _task; const lt_t max_exec_time = tsk_rt(t)->max_exec_time; + const lt_t avg_exec_time = tsk_rt(t)->tot_exec_time / (get_rt_job(t) - 1); struct st_event_record *rec = get_record(ST_TASK_EXIT, t); if (rec) { - rec->data.task_exit.when = now(); + rec->data.task_exit.avg_exec_time = avg_exec_time; rec->data.task_exit.max_exec_time = max_exec_time; put_record(rec); } -- cgit v1.2.2 From c445c89aacd79d3083af45c02b8e7db32bfe9dfb Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Sun, 13 May 2012 20:48:34 -0400 Subject: Store exec time in completion record --- litmus/sched_task_trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 73ce4df517e..c65c021ec80 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -186,7 +186,7 @@ feather_callback void do_sched_trace_task_completion(unsigned long id, struct task_struct *t = (struct task_struct*) _task; struct st_event_record* rec = get_record(ST_COMPLETION, t); if (rec) { - rec->data.completion.when = now(); + rec->data.completion.when = get_exec_time(t); rec->data.completion.forced = forced; put_record(rec); } -- cgit v1.2.2 From 8f08598f8bc3f47a5c26241575e30df64f444641 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Tue, 15 May 2012 13:39:52 -0400 Subject: Summarize schedulability with final record Conflicts: include/litmus/rt_param.h litmus/sched_color.c --- include/litmus/rt_param.h | 3 +++ include/litmus/sched_trace.h | 19 +++++++++++++++++++ litmus/sched_task_trace.c | 15 ++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index 8c996b91ead..20268190757 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h @@ -226,6 +226,9 @@ struct rt_param { /* Pointer to the page shared between userspace and kernel. */ struct control_page * ctrl_page; + lt_t total_tardy; + lt_t max_tardy; + unsigned int missed; lt_t max_exec_time; lt_t tot_exec_time; }; diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index f910c63c067..bf6c4cf4316 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -85,6 +85,12 @@ struct st_task_exit_data { u64 max_exec_time; }; +struct st_task_tardy_data { + u64 total_tardy; + u32 max_tardy; + u32 missed; +}; + #define DATA(x) struct st_ ## x ## _data x; typedef enum { @@ -101,6 +107,7 @@ typedef enum { ST_ACTION, ST_SYS_RELEASE, ST_TASK_EXIT, + ST_TASK_TARDY, } st_event_record_type_t; struct st_event_record { @@ -120,6 +127,7 @@ struct st_event_record { DATA(action); DATA(sys_release); DATA(task_exit); + DATA(task_tardy); } data; }; @@ -163,6 +171,8 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, lt_t* start); feather_callback void do_sched_trace_task_exit(unsigned long id, struct task_struct* task); +feather_callback void do_sched_trace_task_tardy(unsigned long id, + struct task_struct* task); #endif @@ -189,6 +199,7 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, #define trace_litmus_task_resume(t) #define trace_litmus_sys_release(start) #define trace_litmus_task_exit(t) +#define trace_litmus_task_tardy(t) #define trace_litmus_container_param(cid, name) #define trace_litmus_server_param(sid, cid, wcet, time) @@ -292,6 +303,14 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, trace_litmus_task_exit(t); \ } while (0) + +#define sched_trace_task_tardy(t) \ + do { \ + SCHED_TRACE(SCHED_TRACE_BASE_ID + 12, \ + do_sched_trace_task_tardy, t); \ + trace_litmus_task_tardy(t); \ + } while (0) + #define QT_START lt_t _qt_start = litmus_clock() #define QT_END \ sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \ diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index c65c021ec80..60a3e8e5c02 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -227,7 +227,7 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, } feather_callback void do_sched_trace_task_exit(unsigned long id, - unsigned long _task) + unsigned long _task) { struct task_struct *t = (struct task_struct*) _task; const lt_t max_exec_time = tsk_rt(t)->max_exec_time; @@ -241,6 +241,19 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, } } +feather_callback void do_sched_trace_task_tardy(unsigned long id, + unsigned long _task) +{ + struct task_struct *t = (struct task_struct*) _task; + struct st_event_record *rec = get_record(ST_TASK_TARDY, t); + if (rec) { + rec->data.task_tardy.max_tardy = tsk_rt(t)->max_tardy; + rec->data.task_tardy.total_tardy = tsk_rt(t)->total_tardy; + rec->data.task_tardy.missed = tsk_rt(t)->missed; + put_record(rec); + } +} + feather_callback void do_sched_trace_action(unsigned long id, unsigned long _task, unsigned long action) -- cgit v1.2.2 From 20dd1e4970f2a8f0170ed2194a050d45c1271485 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 27 Sep 2012 19:03:47 -0400 Subject: Added exit and tardy hooks. --- include/litmus/litmus.h | 5 +++-- include/litmus/sched_trace.h | 1 - litmus/litmus.c | 3 +++ litmus/preempt.c | 8 ++++---- litmus/sched_task_trace.c | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/litmus/litmus.h b/include/litmus/litmus.h index 807b7888695..3e78b9c6158 100644 --- a/include/litmus/litmus.h +++ b/include/litmus/litmus.h @@ -57,10 +57,11 @@ void litmus_exit_task(struct task_struct *tsk); #define get_rt_phase(t) (tsk_rt(t)->task_params.phase) #define get_partition(t) (tsk_rt(t)->task_params.cpu) #define get_priority(t) (tsk_rt(t)->task_params.priority) -#define get_class(t) (tsk_rt(t)->task_params.cls) +#define get_class(t) (tsk_rt(t)->task_params.cls) /* job_param macros */ -#define get_exec_time(t) (tsk_rt(t)->job_params.exec_time) +#define get_job_no(t) (tsk_rt(t)->job_params.job_no) +#define get_exec_time(t) (tsk_rt(t)->job_params.exec_time) #define get_deadline(t) (tsk_rt(t)->job_params.deadline) #define get_release(t) (tsk_rt(t)->job_params.release) #define get_lateness(t) (tsk_rt(t)->job_params.lateness) diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index bf6c4cf4316..2f992789aff 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h @@ -308,7 +308,6 @@ feather_callback void do_sched_trace_task_tardy(unsigned long id, do { \ SCHED_TRACE(SCHED_TRACE_BASE_ID + 12, \ do_sched_trace_task_tardy, t); \ - trace_litmus_task_tardy(t); \ } while (0) #define QT_START lt_t _qt_start = litmus_clock() diff --git a/litmus/litmus.c b/litmus/litmus.c index 81384327e85..1da1ec9a59b 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -383,6 +383,9 @@ void litmus_exit_task(struct task_struct* tsk) { if (is_realtime(tsk)) { sched_trace_task_completion(tsk, 1); + sched_trace_task_exit(tsk); + sched_trace_task_tardy(tsk); + printk(KERN_WARNING "Swear I'm doing \n"); litmus->task_exit(tsk); diff --git a/litmus/preempt.c b/litmus/preempt.c index 5704d0bf4c0..92c5d1b26a1 100644 --- a/litmus/preempt.c +++ b/litmus/preempt.c @@ -26,10 +26,10 @@ void sched_state_will_schedule(struct task_struct* tsk) set_sched_state(PICKED_WRONG_TASK); else set_sched_state(WILL_SCHEDULE); - } else - /* Litmus tasks should never be subject to a remote - * set_tsk_need_resched(). */ - BUG_ON(is_realtime(tsk)); + } /* else */ + /* /\* Litmus tasks should never be subject to a remote */ + /* * set_tsk_need_resched(). *\/ */ + /* BUG_ON(is_realtime(tsk)); */ #ifdef CONFIG_PREEMPT_STATE_TRACE TRACE_TASK(tsk, "set_tsk_need_resched() ret:%p\n", __builtin_return_address(0)); diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 60a3e8e5c02..7194d2fe6c6 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c @@ -231,7 +231,7 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, { struct task_struct *t = (struct task_struct*) _task; const lt_t max_exec_time = tsk_rt(t)->max_exec_time; - const lt_t avg_exec_time = tsk_rt(t)->tot_exec_time / (get_rt_job(t) - 1); + const lt_t avg_exec_time = tsk_rt(t)->tot_exec_time / (get_job_no(t) - 1); struct st_event_record *rec = get_record(ST_TASK_EXIT, t); if (rec) { -- cgit v1.2.2 From 1b7923bda1cb78dfefae81ec1d9dfc006b746907 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 27 Sep 2012 20:09:25 -0400 Subject: Properly track max_exec_time to output in task_exit record. --- litmus/jobs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litmus/jobs.c b/litmus/jobs.c index 50728a416c6..1dc97d32a35 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c @@ -8,7 +8,11 @@ static inline void setup_release(struct task_struct *t, lt_t release) { - tsk_rt(t)->tot_exec_time += tsk_rt(t)->job_params.exec_time; + lt_t exec_time = tsk_rt(t)->job_params.exec_time; + + tsk_rt(t)->tot_exec_time += exec_time; + if (tsk_rt(t)->max_exec_time < exec_time) + tsk_rt(t)->max_exec_time = exec_time; /* prepare next release */ tsk_rt(t)->job_params.release = tsk_rt(t)->job_params.deadline; -- cgit v1.2.2 From 9f2cc91ad895214eafafe61eded30ad1c0b145bf Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 27 Sep 2012 20:10:18 -0400 Subject: Cleanup. Remove this commit --- litmus/litmus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/litmus/litmus.c b/litmus/litmus.c index 1da1ec9a59b..5e8221da35e 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -385,7 +385,6 @@ void litmus_exit_task(struct task_struct* tsk) sched_trace_task_completion(tsk, 1); sched_trace_task_exit(tsk); sched_trace_task_tardy(tsk); - printk(KERN_WARNING "Swear I'm doing \n"); litmus->task_exit(tsk); -- cgit v1.2.2 From fb90f3b6a8a604a9aed7249045bfed77ce42de5b Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Fri, 28 Sep 2012 16:52:08 -0400 Subject: Move task time accounting into the complete_job method. --- litmus/jobs.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/litmus/jobs.c b/litmus/jobs.c index 1dc97d32a35..8a0c889e2cb 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c @@ -5,18 +5,13 @@ #include #include +#include static inline void setup_release(struct task_struct *t, lt_t release) { - lt_t exec_time = tsk_rt(t)->job_params.exec_time; - - tsk_rt(t)->tot_exec_time += exec_time; - if (tsk_rt(t)->max_exec_time < exec_time) - tsk_rt(t)->max_exec_time = exec_time; - /* prepare next release */ - tsk_rt(t)->job_params.release = tsk_rt(t)->job_params.deadline; - tsk_rt(t)->job_params.deadline += get_rt_period(t); + tsk_rt(t)->job_params.release = release; + tsk_rt(t)->job_params.deadline += release + get_rt_period(t); tsk_rt(t)->job_params.exec_time = 0; /* update job sequence number */ tsk_rt(t)->job_params.job_no++; @@ -52,6 +47,22 @@ void release_at(struct task_struct *t, lt_t start) */ long complete_job(void) { + lt_t amount; + lt_t now = litmus_clock(); + lt_t exec_time = tsk_rt(current)->job_params.exec_time; + + tsk_rt(current)->tot_exec_time += exec_time; + if (lt_before(tsk_rt(current)->max_exec_time, exec_time)) + tsk_rt(current)->max_exec_time = exec_time; + + if (is_tardy(current, now)) { + amount = now - get_deadline(current); + if (lt_after(amount, tsk_rt(current)->max_tardy)) + tsk_rt(current)->max_tardy = amount; + tsk_rt(current)->total_tardy += amount; + ++tsk_rt(current)->missed; + } + /* Mark that we do not excute anymore */ set_rt_flags(current, RT_F_SLEEP); /* call schedule, this will return when a new job arrives -- cgit v1.2.2