diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-05-15 13:39:52 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-05-15 13:39:52 -0400 |
commit | 1cb90226816c7af7808be4c0de866c54da17ecc9 (patch) | |
tree | 512ff08edb877b615aa72f6bec06c29d17ef53a3 | |
parent | 5b2b006507f91f9beeb9538698018fb61d36caf0 (diff) |
Summarize schedulability with final recordwip-color
-rw-r--r-- | include/litmus/rt_param.h | 5 | ||||
-rw-r--r-- | include/litmus/sched_trace.h | 19 | ||||
-rw-r--r-- | litmus/sched_color.c | 15 | ||||
-rw-r--r-- | litmus/sched_task_trace.c | 15 |
4 files changed, 52 insertions, 2 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index 003eaf32aa7f..ef9f1fb77c5b 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -228,6 +228,11 @@ struct rt_param { | |||
228 | /* Pointer to the page shared between userspace and kernel. */ | 228 | /* Pointer to the page shared between userspace and kernel. */ |
229 | struct control_page * ctrl_page; | 229 | struct control_page * ctrl_page; |
230 | 230 | ||
231 | |||
232 | lt_t total_tardy; | ||
233 | lt_t max_tardy; | ||
234 | unsigned int missed; | ||
235 | |||
231 | #ifdef CONFIG_PLUGIN_COLOR | 236 | #ifdef CONFIG_PLUGIN_COLOR |
232 | lt_t max_exec_time; | 237 | lt_t max_exec_time; |
233 | lt_t tot_exec_time; | 238 | lt_t tot_exec_time; |
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index d14eeaf0099f..c94b096cf855 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h | |||
@@ -86,6 +86,12 @@ struct st_task_exit_data { | |||
86 | u64 max_exec_time; | 86 | u64 max_exec_time; |
87 | }; | 87 | }; |
88 | 88 | ||
89 | struct st_task_tardy_data { | ||
90 | u64 total_tardy; | ||
91 | u32 max_tardy; | ||
92 | u32 missed; | ||
93 | }; | ||
94 | |||
89 | #define DATA(x) struct st_ ## x ## _data x; | 95 | #define DATA(x) struct st_ ## x ## _data x; |
90 | 96 | ||
91 | typedef enum { | 97 | typedef enum { |
@@ -102,6 +108,7 @@ typedef enum { | |||
102 | ST_ACTION, | 108 | ST_ACTION, |
103 | ST_SYS_RELEASE, | 109 | ST_SYS_RELEASE, |
104 | ST_TASK_EXIT, | 110 | ST_TASK_EXIT, |
111 | ST_TASK_TARDY, | ||
105 | } st_event_record_type_t; | 112 | } st_event_record_type_t; |
106 | 113 | ||
107 | struct st_event_record { | 114 | struct st_event_record { |
@@ -121,6 +128,7 @@ struct st_event_record { | |||
121 | DATA(action); | 128 | DATA(action); |
122 | DATA(sys_release); | 129 | DATA(sys_release); |
123 | DATA(task_exit); | 130 | DATA(task_exit); |
131 | DATA(task_tardy); | ||
124 | } data; | 132 | } data; |
125 | }; | 133 | }; |
126 | 134 | ||
@@ -164,6 +172,8 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, | |||
164 | lt_t* start); | 172 | lt_t* start); |
165 | feather_callback void do_sched_trace_task_exit(unsigned long id, | 173 | feather_callback void do_sched_trace_task_exit(unsigned long id, |
166 | struct task_struct* task); | 174 | struct task_struct* task); |
175 | feather_callback void do_sched_trace_task_tardy(unsigned long id, | ||
176 | struct task_struct* task); | ||
167 | 177 | ||
168 | #endif | 178 | #endif |
169 | 179 | ||
@@ -190,6 +200,7 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, | |||
190 | #define trace_litmus_task_resume(t, i) | 200 | #define trace_litmus_task_resume(t, i) |
191 | #define trace_litmus_sys_release(start) | 201 | #define trace_litmus_sys_release(start) |
192 | #define trace_litmus_task_exit(t) | 202 | #define trace_litmus_task_exit(t) |
203 | #define trace_litmus_task_tardy(t) | ||
193 | 204 | ||
194 | #define trace_litmus_resource_acquire(t, i); | 205 | #define trace_litmus_resource_acquire(t, i); |
195 | #define trace_litmus_resource_release(t, i); | 206 | #define trace_litmus_resource_release(t, i); |
@@ -281,6 +292,14 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, | |||
281 | trace_litmus_task_exit(t); \ | 292 | trace_litmus_task_exit(t); \ |
282 | } while (0) | 293 | } while (0) |
283 | 294 | ||
295 | |||
296 | #define sched_trace_task_tardy(t) \ | ||
297 | do { \ | ||
298 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 12, \ | ||
299 | do_sched_trace_task_tardy, t); \ | ||
300 | trace_litmus_task_tardy(t); \ | ||
301 | } while (0) | ||
302 | |||
284 | #define QT_START lt_t _qt_start = litmus_clock() | 303 | #define QT_START lt_t _qt_start = litmus_clock() |
285 | #define QT_END \ | 304 | #define QT_END \ |
286 | sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \ | 305 | sched_trace_log_message("%d P%d [%s@%s:%d]: Took %llu\n\n", \ |
diff --git a/litmus/sched_color.c b/litmus/sched_color.c index e72fdc3bb7d1..44327d60aaa5 100644 --- a/litmus/sched_color.c +++ b/litmus/sched_color.c | |||
@@ -305,7 +305,7 @@ static void job_arrival(struct task_struct *t) | |||
305 | static void job_completion(struct rt_server *server) | 305 | static void job_completion(struct rt_server *server) |
306 | { | 306 | { |
307 | struct task_struct *t = server->linked; | 307 | struct task_struct *t = server->linked; |
308 | lt_t et; | 308 | lt_t et, now = litmus_clock(); |
309 | 309 | ||
310 | TRACE_TASK(t, "Job completed\n"); | 310 | TRACE_TASK(t, "Job completed\n"); |
311 | if (is_server(t)) | 311 | if (is_server(t)) |
@@ -320,6 +320,15 @@ static void job_completion(struct rt_server *server) | |||
320 | tsk_rt(t)->max_exec_time = et; | 320 | tsk_rt(t)->max_exec_time = et; |
321 | } | 321 | } |
322 | 322 | ||
323 | if (is_tardy(t, now)) { | ||
324 | lt_t miss = now - get_deadline(t); | ||
325 | ++tsk_rt(t)->missed; | ||
326 | tsk_rt(t)->total_tardy += miss; | ||
327 | if (lt_before(tsk_rt(t)->max_tardy, miss)) { | ||
328 | tsk_rt(t)->max_tardy = miss; | ||
329 | } | ||
330 | } | ||
331 | |||
323 | unlink(server); | 332 | unlink(server); |
324 | set_rt_flags(t, RT_F_SLEEP); | 333 | set_rt_flags(t, RT_F_SLEEP); |
325 | prepare_for_next_period(t); | 334 | prepare_for_next_period(t); |
@@ -566,6 +575,9 @@ static void color_task_new(struct task_struct *t, int on_rq, int running) | |||
566 | tsk_rt(t)->req = req; | 575 | tsk_rt(t)->req = req; |
567 | tsk_rt(t)->tot_exec_time = 0; | 576 | tsk_rt(t)->tot_exec_time = 0; |
568 | tsk_rt(t)->max_exec_time = 0; | 577 | tsk_rt(t)->max_exec_time = 0; |
578 | tsk_rt(t)->max_tardy = 0; | ||
579 | tsk_rt(t)->missed = 0; | ||
580 | tsk_rt(t)->total_tardy = 0; | ||
569 | tsk_rt(t)->ctrl_page->colors_updated = 1; | 581 | tsk_rt(t)->ctrl_page->colors_updated = 1; |
570 | tsk_rt(t)->last_exec_time = 0; | 582 | tsk_rt(t)->last_exec_time = 0; |
571 | 583 | ||
@@ -644,6 +656,7 @@ static void color_task_exit(struct task_struct *t) | |||
644 | local_irq_save(flags); | 656 | local_irq_save(flags); |
645 | 657 | ||
646 | sched_trace_task_exit(t); | 658 | sched_trace_task_exit(t); |
659 | sched_trace_task_tardy(t); | ||
647 | 660 | ||
648 | /* Remove from scheduler consideration */ | 661 | /* Remove from scheduler consideration */ |
649 | if (is_queued(t)) { | 662 | if (is_queued(t)) { |
diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 48124b756be7..d4fedaa15744 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, | |||
227 | } | 227 | } |
228 | 228 | ||
229 | feather_callback void do_sched_trace_task_exit(unsigned long id, | 229 | feather_callback void do_sched_trace_task_exit(unsigned long id, |
230 | unsigned long _task) | 230 | unsigned long _task) |
231 | { | 231 | { |
232 | struct task_struct *t = (struct task_struct*) _task; | 232 | struct task_struct *t = (struct task_struct*) _task; |
233 | #ifdef CONFIG_PLUGIN_COLOR | 233 | #ifdef CONFIG_PLUGIN_COLOR |
@@ -245,6 +245,19 @@ feather_callback void do_sched_trace_task_exit(unsigned long id, | |||
245 | } | 245 | } |
246 | } | 246 | } |
247 | 247 | ||
248 | feather_callback void do_sched_trace_task_tardy(unsigned long id, | ||
249 | unsigned long _task) | ||
250 | { | ||
251 | struct task_struct *t = (struct task_struct*) _task; | ||
252 | struct st_event_record *rec = get_record(ST_TASK_TARDY, t); | ||
253 | if (rec) { | ||
254 | rec->data.task_tardy.max_tardy = tsk_rt(t)->max_tardy; | ||
255 | rec->data.task_tardy.total_tardy = tsk_rt(t)->total_tardy; | ||
256 | rec->data.task_tardy.missed = tsk_rt(t)->missed; | ||
257 | put_record(rec); | ||
258 | } | ||
259 | } | ||
260 | |||
248 | feather_callback void do_sched_trace_action(unsigned long id, | 261 | feather_callback void do_sched_trace_action(unsigned long id, |
249 | unsigned long _task, | 262 | unsigned long _task, |
250 | unsigned long action) | 263 | unsigned long action) |