aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-05-15 13:39:52 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-05-15 13:39:52 -0400
commit1cb90226816c7af7808be4c0de866c54da17ecc9 (patch)
tree512ff08edb877b615aa72f6bec06c29d17ef53a3
parent5b2b006507f91f9beeb9538698018fb61d36caf0 (diff)
Summarize schedulability with final recordwip-color
-rw-r--r--include/litmus/rt_param.h5
-rw-r--r--include/litmus/sched_trace.h19
-rw-r--r--litmus/sched_color.c15
-rw-r--r--litmus/sched_task_trace.c15
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
89struct 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
91typedef enum { 97typedef 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
107struct st_event_record { 114struct 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);
165feather_callback void do_sched_trace_task_exit(unsigned long id, 173feather_callback void do_sched_trace_task_exit(unsigned long id,
166 struct task_struct* task); 174 struct task_struct* task);
175feather_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)
305static void job_completion(struct rt_server *server) 305static 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
229feather_callback void do_sched_trace_task_exit(unsigned long id, 229feather_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
248feather_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
248feather_callback void do_sched_trace_action(unsigned long id, 261feather_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)