diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-07 02:35:38 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-07 02:35:38 -0400 |
commit | 158a44baec2e855f6a4f0359a87e2b88c348a955 (patch) | |
tree | 68dd8d74908e97a50ed84e5a7b36aa40ffddfbb5 /kernel | |
parent | 9fb6f8ad40d1ba1cd946adb930a3dafc230f4dc6 (diff) |
adaptive: fix weight change metric
It does not depend on absolute error, but on relative change.
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_adaptive.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/kernel/sched_adaptive.c b/kernel/sched_adaptive.c index 8ccb7a006e..54d707b880 100644 --- a/kernel/sched_adaptive.c +++ b/kernel/sched_adaptive.c | |||
@@ -141,6 +141,7 @@ static void set_service_level(struct task_struct* t, unsigned int level) | |||
141 | 141 | ||
142 | void adaptive_optimize(void) | 142 | void adaptive_optimize(void) |
143 | { | 143 | { |
144 | TRACE("running adaptive optimizer\n"); | ||
144 | last_optimizer_run = jiffies; | 145 | last_optimizer_run = jiffies; |
145 | } | 146 | } |
146 | 147 | ||
@@ -394,7 +395,7 @@ static reschedule_check_t adaptive_scheduler_tick(void) | |||
394 | static noinline void job_completion(struct task_struct *t) | 395 | static noinline void job_completion(struct task_struct *t) |
395 | { | 396 | { |
396 | long delta; | 397 | long delta; |
397 | fp_t actual_weight; | 398 | fp_t actual_weight, old_estimate; |
398 | BUG_ON(!t); | 399 | BUG_ON(!t); |
399 | 400 | ||
400 | sched_trace_job_completion(t); | 401 | sched_trace_job_completion(t); |
@@ -403,9 +404,12 @@ static noinline void job_completion(struct task_struct *t) | |||
403 | 404 | ||
404 | actual_weight = _frac(t->rt_param.times.exec_time, | 405 | actual_weight = _frac(t->rt_param.times.exec_time, |
405 | t->rt_param.basic_params.period); | 406 | t->rt_param.basic_params.period); |
407 | old_estimate = get_estimated_weight(t); | ||
406 | update_estimate(&t->rt_param.predictor_state, actual_weight, | 408 | update_estimate(&t->rt_param.predictor_state, actual_weight, |
407 | fc_a, fc_b, fc_c); | 409 | fc_a, fc_b, fc_c); |
408 | if (_gt(_abs(t->rt_param.predictor_state.error), task_error_threshold)) | 410 | if (_gt(_div(_abs(get_estimated_weight(t) - old_estimate), |
411 | get_estimate_weight(t)), | ||
412 | task_error_threshold)) | ||
409 | adaptive_optimize(); | 413 | adaptive_optimize(); |
410 | 414 | ||
411 | TRACE_TASK(t, "job %d completes, delta WCET = %d\n", | 415 | TRACE_TASK(t, "job %d completes, delta WCET = %d\n", |