diff options
| author | Glenn Elliott <gelliott@cs.unc.edu> | 2010-11-29 11:41:40 -0500 |
|---|---|---|
| committer | Glenn Elliott <gelliott@cs.unc.edu> | 2010-11-29 11:41:40 -0500 |
| commit | f2ddb884f2300cd7709237975206e5b9d9b18445 (patch) | |
| tree | 76a932872cf8c42f780a3499fb76cee372ce0c91 | |
| parent | 4c5c517602f595092979716bacf565fc333ad5fe (diff) | |
Add sched_trace data for Apative EDZLwip-aedzl-revised
Added new trace event, st_task_completion_adaptive, to trace estimated
execution time and estimation error when an AEDZL task completes.
| -rw-r--r-- | include/litmus/sched_trace.h | 12 | ||||
| -rw-r--r-- | litmus/sched_aedzl.c | 1 | ||||
| -rw-r--r-- | litmus/sched_task_trace.c | 20 |
3 files changed, 33 insertions, 0 deletions
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h index e1b0c9712b5f..237d1e1641d0 100644 --- a/include/litmus/sched_trace.h +++ b/include/litmus/sched_trace.h | |||
| @@ -57,6 +57,12 @@ struct st_completion_data { /* A job completed. */ | |||
| 57 | u8 __unused[3]; | 57 | u8 __unused[3]; |
| 58 | }; | 58 | }; |
| 59 | 59 | ||
| 60 | struct st_completion_adaptive_data { /* Extra completion data for AEDZL */ | ||
| 61 | u32 estimated_exe; | ||
| 62 | s32 accumulated_err; | ||
| 63 | u8 __unused[8]; | ||
| 64 | }; | ||
| 65 | |||
| 60 | struct st_block_data { /* A task blocks. */ | 66 | struct st_block_data { /* A task blocks. */ |
| 61 | u64 when; | 67 | u64 when; |
| 62 | u64 __unused; | 68 | u64 __unused; |
| @@ -86,6 +92,7 @@ typedef enum { | |||
| 86 | ST_BLOCK, | 92 | ST_BLOCK, |
| 87 | ST_RESUME, | 93 | ST_RESUME, |
| 88 | ST_SYS_RELEASE, | 94 | ST_SYS_RELEASE, |
| 95 | ST_COMPLETION_ADAPTIVE | ||
| 89 | } st_event_record_type_t; | 96 | } st_event_record_type_t; |
| 90 | 97 | ||
| 91 | struct st_event_record { | 98 | struct st_event_record { |
| @@ -100,6 +107,7 @@ struct st_event_record { | |||
| 100 | DATA(switch_to); | 107 | DATA(switch_to); |
| 101 | DATA(switch_away); | 108 | DATA(switch_away); |
| 102 | DATA(completion); | 109 | DATA(completion); |
| 110 | DATA(completion_adaptive); | ||
| 103 | DATA(block); | 111 | DATA(block); |
| 104 | DATA(resume); | 112 | DATA(resume); |
| 105 | DATA(sys_release); | 113 | DATA(sys_release); |
| @@ -136,6 +144,8 @@ feather_callback void do_sched_trace_task_switch_away(unsigned long id, | |||
| 136 | feather_callback void do_sched_trace_task_completion(unsigned long id, | 144 | feather_callback void do_sched_trace_task_completion(unsigned long id, |
| 137 | struct task_struct* task, | 145 | struct task_struct* task, |
| 138 | unsigned long forced); | 146 | unsigned long forced); |
| 147 | feather_callback void do_sched_trace_task_completion_adaptive(unsigned long id, | ||
| 148 | struct task_struct* task); | ||
| 139 | feather_callback void do_sched_trace_task_block(unsigned long id, | 149 | feather_callback void do_sched_trace_task_block(unsigned long id, |
| 140 | struct task_struct* task); | 150 | struct task_struct* task); |
| 141 | feather_callback void do_sched_trace_task_resume(unsigned long id, | 151 | feather_callback void do_sched_trace_task_resume(unsigned long id, |
| @@ -175,6 +185,8 @@ feather_callback void do_sched_trace_sys_release(unsigned long id, | |||
| 175 | /* when is a pointer, it does not need an explicit cast to unsigned long */ | 185 | /* when is a pointer, it does not need an explicit cast to unsigned long */ |
| 176 | #define sched_trace_sys_release(when) \ | 186 | #define sched_trace_sys_release(when) \ |
| 177 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 9, do_sched_trace_sys_release, when) | 187 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 9, do_sched_trace_sys_release, when) |
| 188 | #define sched_trace_task_completion_adaptive(t) \ | ||
| 189 | SCHED_TRACE(SCHED_TRACE_BASE_ID + 10, do_sched_trace_task_completion_adaptive, t) | ||
| 178 | 190 | ||
| 179 | #define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ | 191 | #define sched_trace_quantum_boundary() /* NOT IMPLEMENTED */ |
| 180 | 192 | ||
diff --git a/litmus/sched_aedzl.c b/litmus/sched_aedzl.c index 4943e1ed7616..99c1ad02bbb4 100644 --- a/litmus/sched_aedzl.c +++ b/litmus/sched_aedzl.c | |||
| @@ -514,6 +514,7 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
| 514 | BUG_ON(!t); | 514 | BUG_ON(!t); |
| 515 | 515 | ||
| 516 | sched_trace_task_completion(t, forced); | 516 | sched_trace_task_completion(t, forced); |
| 517 | sched_trace_task_completion_adaptive(t); | ||
| 517 | 518 | ||
| 518 | TRACE_TASK(t, "job_completion().\n"); | 519 | TRACE_TASK(t, "job_completion().\n"); |
| 519 | 520 | ||
diff --git a/litmus/sched_task_trace.c b/litmus/sched_task_trace.c index 39a543e22d41..4ae14ac63c2e 100644 --- a/litmus/sched_task_trace.c +++ b/litmus/sched_task_trace.c | |||
| @@ -169,6 +169,26 @@ feather_callback void do_sched_trace_task_completion(unsigned long id, | |||
| 169 | } | 169 | } |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | feather_callback void do_sched_trace_task_completion_adaptive(unsigned long id, | ||
| 173 | unsigned long _task) | ||
| 174 | { | ||
| 175 | struct task_struct *t = (struct task_struct*) _task; | ||
| 176 | struct st_event_record* rec = get_record(ST_COMPLETION_ADAPTIVE, t); | ||
| 177 | if (rec) { | ||
| 178 | s32 err; | ||
| 179 | rec->data.completion_adaptive.estimated_exe = get_exec_cost_est(t); | ||
| 180 | |||
| 181 | err = _fp_to_integer(_mul(tsk_rt(t)->zl_accum_err, _frac(get_rt_period(t), 1))); | ||
| 182 | if((err < 0) && _point(tsk_rt(t)->zl_accum_err) < 0) | ||
| 183 | { | ||
| 184 | err *= -1; | ||
| 185 | } | ||
| 186 | rec->data.completion_adaptive.accumulated_err = err; | ||
| 187 | |||
| 188 | put_record(rec); | ||
| 189 | } | ||
| 190 | } | ||
| 191 | |||
| 172 | feather_callback void do_sched_trace_task_block(unsigned long id, | 192 | feather_callback void do_sched_trace_task_block(unsigned long id, |
| 173 | unsigned long _task) | 193 | unsigned long _task) |
| 174 | { | 194 | { |
