diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-22 17:28:07 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-22 17:28:07 -0400 |
commit | 048c78c2d83ba6d95393c9bd432e9d03ef9bda5b (patch) | |
tree | c80c5b5a1d577bad1ad3886b741da60b324bc3d0 | |
parent | 15ec3c2b2885222a682ba7805e6ee1b1ab76b652 (diff) |
Track queue computation time.
-rw-r--r-- | include/litmus/rt_param.h | 3 | ||||
-rw-r--r-- | include/litmus/sched_trace.h | 84 | ||||
-rw-r--r-- | litmus/sched_mc.c | 8 | ||||
-rw-r--r-- | litmus/sched_task_trace.c | 5 |
4 files changed, 58 insertions, 42 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index 103b03f4e67e..2a5cdecb4f46 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -275,6 +275,9 @@ struct rt_param { | |||
275 | lt_t max_tardy; | 275 | lt_t max_tardy; |
276 | unsigned int missed; | 276 | unsigned int missed; |
277 | 277 | ||
278 | lt_t load; | ||
279 | lt_t flush; | ||
280 | |||
278 | lt_t max_exec_time; | 281 | lt_t max_exec_time; |
279 | lt_t tot_exec_time; | 282 | lt_t tot_exec_time; |
280 | lt_t last_exec_time; | 283 | lt_t last_exec_time; |
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index 6bad8a78e4a0..2f15da3c9e36 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h | |||
@@ -53,11 +53,13 @@ struct st_switch_away_data { /* A process was switched away from on a given CPU. | |||
53 | 53 | ||
54 | struct st_completion_data { /* A job completed. */ | 54 | struct st_completion_data { /* A job completed. */ |
55 | u64 when; | 55 | u64 when; |
56 | u8 forced:1; /* Set to 1 if job overran and kernel advanced to the | 56 | u32 flush; |
57 | * next task automatically; set to 0 otherwise. | 57 | u32 load; |
58 | */ | 58 | /* u8 forced:1; /\* Set to 1 if job overran and kernel advanced to the */ |
59 | u8 __uflags:7; | 59 | /* * next task automatically; set to 0 otherwise. */ |
60 | u8 __unused[7]; | 60 | /* *\/ */ |
61 | /* u8 __uflags:7; */ | ||
62 | /* u8 __unused[7]; */ | ||
61 | }; | 63 | }; |
62 | 64 | ||
63 | struct st_block_data { /* A task blocks. */ | 65 | struct st_block_data { /* A task blocks. */ |
@@ -228,26 +230,26 @@ feather_callback void do_sched_trace_task_tardy(unsigned long id, | |||
228 | trace_litmus_task_param(t); \ | 230 | trace_litmus_task_param(t); \ |
229 | } while (0) | 231 | } while (0) |
230 | 232 | ||
231 | #define sched_trace_task_release(t) \ | 233 | #define sched_trace_task_release(t)/* \ */ |
232 | do { \ | 234 | /* do { \ */ |
233 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 3, \ | 235 | /* SCHED_TRACE(SCHED_TRACE_BASE_ID + 3, \ */ |
234 | do_sched_trace_task_release, t); \ | 236 | /* do_sched_trace_task_release, t); \ */ |
235 | trace_litmus_task_release(t); \ | 237 | /* trace_litmus_task_release(t); \ */ |
236 | } while (0) | 238 | /* } while (0) */ |
237 | 239 | ||
238 | #define sched_trace_task_switch_to(t) \ | 240 | #define sched_trace_task_switch_to(t)/* \ */ |
239 | do { \ | 241 | /* do { \ */ |
240 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 4, \ | 242 | /* SCHED_TRACE(SCHED_TRACE_BASE_ID + 4, \ */ |
241 | do_sched_trace_task_switch_to, t); \ | 243 | /* do_sched_trace_task_switch_to, t); \ */ |
242 | trace_litmus_switch_to(t); \ | 244 | /* trace_litmus_switch_to(t); \ */ |
243 | } while (0) | 245 | /* } while (0) */ |
244 | 246 | ||
245 | #define sched_trace_task_switch_away(t) \ | 247 | #define sched_trace_task_switch_away(t)/* \ */ |
246 | do { \ | 248 | /* do { \ */ |
247 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 5, \ | 249 | /* SCHED_TRACE(SCHED_TRACE_BASE_ID + 5, \ */ |
248 | do_sched_trace_task_switch_away, t); \ | 250 | /* do_sched_trace_task_switch_away, t); \ */ |
249 | trace_litmus_switch_away(t); \ | 251 | /* trace_litmus_switch_away(t); \ */ |
250 | } while (0) | 252 | /* } while (0) */ |
251 | 253 | ||
252 | #define sched_trace_task_completion(t, forced) \ | 254 | #define sched_trace_task_completion(t, forced) \ |
253 | do { \ | 255 | do { \ |
@@ -257,30 +259,30 @@ feather_callback void do_sched_trace_task_tardy(unsigned long id, | |||
257 | trace_litmus_task_completion(t, forced); \ | 259 | trace_litmus_task_completion(t, forced); \ |
258 | } while (0) | 260 | } while (0) |
259 | 261 | ||
260 | #define sched_trace_task_block_on(t, i) \ | 262 | #define sched_trace_task_block_on(t, i)/* \ */ |
261 | do { \ | 263 | /* do { \ */ |
262 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 7, \ | 264 | /* SCHED_TRACE(SCHED_TRACE_BASE_ID + 7, \ */ |
263 | do_sched_trace_task_block, t); \ | 265 | /* do_sched_trace_task_block, t); \ */ |
264 | trace_litmus_task_block(t, i); \ | 266 | /* trace_litmus_task_block(t, i); \ */ |
265 | } while (0) | 267 | /* } while (0) */ |
266 | 268 | ||
267 | #define sched_trace_task_block(t) \ | 269 | #define sched_trace_task_block(t) \ |
268 | sched_trace_task_block_on(t, 0) | 270 | sched_trace_task_block_on(t, 0) |
269 | 271 | ||
270 | #define sched_trace_task_resume_on(t, i) \ | 272 | #define sched_trace_task_resume_on(t, i)/* \ */ |
271 | do { \ | 273 | /* do { \ */ |
272 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 8, \ | 274 | /* SCHED_TRACE(SCHED_TRACE_BASE_ID + 8, \ */ |
273 | do_sched_trace_task_resume, t); \ | 275 | /* do_sched_trace_task_resume, t); \ */ |
274 | trace_litmus_task_resume(t, i); \ | 276 | /* trace_litmus_task_resume(t, i); \ */ |
275 | } while (0) | 277 | /* } while (0) */ |
276 | 278 | ||
277 | #define sched_trace_task_resume(t) \ | 279 | #define sched_trace_task_resume(t) \ |
278 | sched_trace_task_resume_on(t, 0) | 280 | sched_trace_task_resume_on(t, 0) |
279 | 281 | ||
280 | #define sched_trace_resource_acquire(t, i) \ | 282 | #define sched_trace_resource_acquire(t, i)/* \ */ |
281 | do { \ | 283 | /* do { \ */ |
282 | trace_litmus_resource_acquire(t, i); \ | 284 | /* trace_litmus_resource_acquire(t, i); \ */ |
283 | } while (0) | 285 | /* } while (0) */ |
284 | 286 | ||
285 | #define sched_trace_resource_released(t, i) \ | 287 | #define sched_trace_resource_released(t, i) \ |
286 | do { \ | 288 | do { \ |
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c index 3034878b0edd..73cc5ff5fc13 100644 --- a/litmus/sched_mc.c +++ b/litmus/sched_mc.c | |||
@@ -970,6 +970,9 @@ static void mc_task_new(struct task_struct *t, int on_rq, int running) | |||
970 | entry = &per_cpu(cpus, task_cpu(t)); | 970 | entry = &per_cpu(cpus, task_cpu(t)); |
971 | t->rt_param._domain = entry->crit_entries[level].domain; | 971 | t->rt_param._domain = entry->crit_entries[level].domain; |
972 | 972 | ||
973 | tsk_rt(t)->flush = 0; | ||
974 | tsk_rt(t)->load = 0; | ||
975 | |||
973 | /* Userspace and kernelspace view of task state may differ. | 976 | /* Userspace and kernelspace view of task state may differ. |
974 | * Model kernel state as a budget enforced container | 977 | * Model kernel state as a budget enforced container |
975 | */ | 978 | */ |
@@ -1285,6 +1288,7 @@ static void process_signals(struct cpu_entry *entry) | |||
1285 | */ | 1288 | */ |
1286 | static struct task_struct* mc_schedule(struct task_struct* prev) | 1289 | static struct task_struct* mc_schedule(struct task_struct* prev) |
1287 | { | 1290 | { |
1291 | lt_t start; | ||
1288 | int out_of_time, sleep, preempt, exists, blocks, global, lower; | 1292 | int out_of_time, sleep, preempt, exists, blocks, global, lower; |
1289 | struct cpu_entry* entry = &__get_cpu_var(cpus); | 1293 | struct cpu_entry* entry = &__get_cpu_var(cpus); |
1290 | struct task_struct *next = NULL; | 1294 | struct task_struct *next = NULL; |
@@ -1311,7 +1315,9 @@ static struct task_struct* mc_schedule(struct task_struct* prev) | |||
1311 | 1315 | ||
1312 | if (prev && tsk_mc_crit(prev) == CRIT_LEVEL_B && | 1316 | if (prev && tsk_mc_crit(prev) == CRIT_LEVEL_B && |
1313 | is_realtime(prev) && get_rt_job(prev) > 1) { | 1317 | is_realtime(prev) && get_rt_job(prev) > 1) { |
1318 | start = litmus_clock(); | ||
1314 | color_sched_out_task(prev); | 1319 | color_sched_out_task(prev); |
1320 | tsk_rt(prev)->flush = litmus_clock() - start; | ||
1315 | } | 1321 | } |
1316 | 1322 | ||
1317 | 1323 | ||
@@ -1373,7 +1379,9 @@ static struct task_struct* mc_schedule(struct task_struct* prev) | |||
1373 | 1379 | ||
1374 | if (next != prev) { | 1380 | if (next != prev) { |
1375 | if (next && tsk_mc_crit(next) == CRIT_LEVEL_B) { | 1381 | if (next && tsk_mc_crit(next) == CRIT_LEVEL_B) { |
1382 | start = litmus_clock(); | ||
1376 | color_sched_in_task(next); | 1383 | color_sched_in_task(next); |
1384 | tsk_rt(next)->load = litmus_clock() - start; | ||
1377 | } | 1385 | } |
1378 | } | 1386 | } |
1379 | 1387 | ||
diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 3f4a0a1081c3..9612ed5831a1 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c | |||
@@ -199,7 +199,10 @@ feather_callback void do_sched_trace_task_completion(unsigned long id, | |||
199 | struct st_event_record* rec = get_record(ST_COMPLETION, t); | 199 | struct st_event_record* rec = get_record(ST_COMPLETION, t); |
200 | if (rec) { | 200 | if (rec) { |
201 | rec->data.completion.when = tsk_rt(t)->user_job.exec_time; | 201 | rec->data.completion.when = tsk_rt(t)->user_job.exec_time; |
202 | rec->data.completion.forced = forced; | 202 | rec->data.completion.flush = tsk_rt(t)->flush; |
203 | rec->data.completion.load = tsk_rt(t)->load; | ||
204 | tsk_rt(t)->flush = 0; | ||
205 | tsk_rt(t)->load = 0; | ||
203 | put_record(rec); | 206 | put_record(rec); |
204 | } | 207 | } |
205 | } | 208 | } |