aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-09 06:49:49 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-09 06:49:49 -0400
commit963259cdad73a9f7884177bde4bf949115dcf5ad (patch)
tree246e6f93e1a31c0ccd4896e2a54af123cf4b02d9 /kernel
parentd2dd099221321f98a612027174d95e6bff2e0bc8 (diff)
adaptive: only send signal when requested.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/litmus.c13
-rw-r--r--kernel/sched_adaptive.c13
-rw-r--r--kernel/sched_edf_hsb.c2
3 files changed, 23 insertions, 5 deletions
diff --git a/kernel/litmus.c b/kernel/litmus.c
index 6da271f047..35160b7dd4 100644
--- a/kernel/litmus.c
+++ b/kernel/litmus.c
@@ -497,7 +497,18 @@ asmlinkage spolicy sys_sched_getpolicy(void)
497 497
498asmlinkage int sys_scheduler_setup(int cmd, void __user *parameter) 498asmlinkage int sys_scheduler_setup(int cmd, void __user *parameter)
499{ 499{
500 return curr_sched_plugin->scheduler_setup(cmd, parameter); 500 int ret = -EINVAL;
501
502 switch (cmd) {
503 case ENABLE_WEIGHT_CHANGE_SIGNAL:
504 current->rt_param.signal_ready = 1;
505 ret = 0;
506 break;
507 default:
508 ret = curr_sched_plugin->scheduler_setup(cmd, parameter);
509 };
510
511 return ret;
501} 512}
502 513
503/* only call with interrupts disabled! */ 514/* only call with interrupts disabled! */
diff --git a/kernel/sched_adaptive.c b/kernel/sched_adaptive.c
index 4a4ab430e0..f78b4d848d 100644
--- a/kernel/sched_adaptive.c
+++ b/kernel/sched_adaptive.c
@@ -186,7 +186,8 @@ static void set_service_level(struct task_struct* t, unsigned int level)
186 t->rt_param.basic_params.exec_cost = _round(_mul(new->weight, 186 t->rt_param.basic_params.exec_cost = _round(_mul(new->weight,
187 FP(new->period))); 187 FP(new->period)));
188 188
189 scheduler_signal(t, SIGUSR1); 189 if (t->rt_param.signal_ready)
190 scheduler_signal(t, SIGUSR1);
190 191
191 sched_trace_service_level_change(t); 192 sched_trace_service_level_change(t);
192 TRACE_TASK(t, "service level %u activated\n", level); 193 TRACE_TASK(t, "service level %u activated\n", level);
@@ -195,9 +196,10 @@ static void set_service_level(struct task_struct* t, unsigned int level)
195/* call this _before_ updating deadline and release of t */ 196/* call this _before_ updating deadline and release of t */
196static void update_weight_estimate(struct task_struct* t) 197static void update_weight_estimate(struct task_struct* t)
197{ 198{
198 fp_t nw; 199 fp_t nw, ow;
199 jiffie_t sl_period, exec_time; 200 jiffie_t sl_period, exec_time;
200 201
202 ow = get_est_weight(t);
201 nw = t->rt_param.opt_nw; 203 nw = t->rt_param.opt_nw;
202 exec_time = t->rt_param.times.exec_time; 204 exec_time = t->rt_param.times.exec_time;
203 sl_period = get_sl(t, get_opt_sl(t)).period; 205 sl_period = get_sl(t, get_opt_sl(t)).period;
@@ -205,6 +207,7 @@ static void update_weight_estimate(struct task_struct* t)
205 t->rt_param.predictor_state.estimate = 207 t->rt_param.predictor_state.estimate =
206 _div( _max(_mul(nw, FP(sl_period)), FP(exec_time)), 208 _div( _max(_mul(nw, FP(sl_period)), FP(exec_time)),
207 FP(get_deadline(t) - get_last_release(t))); 209 FP(get_deadline(t) - get_last_release(t)));
210 TRACE_TASK(t, " update_weight_estimate: " _FP_ " => " _FP_ "\n", ow, get_est_weight(t));
208} 211}
209 212
210 213
@@ -789,6 +792,10 @@ static noinline void job_completion(struct task_struct *t)
789 old_estimate = get_est_weight(t); 792 old_estimate = get_est_weight(t);
790 update_estimate(&t->rt_param.predictor_state, actual_weight, 793 update_estimate(&t->rt_param.predictor_state, actual_weight,
791 fc_a, fc_b); 794 fc_a, fc_b);
795
796 TRACE_TASK(t, " weight estimation: error=" _FP_ " weight=" _FP_ " => " _FP_ "\n",
797 _sub(get_est_weight(t), old_estimate),
798 old_estimate, get_est_weight(t));
792 if (_gt(_div(_abs(_sub(get_est_weight(t), old_estimate)), 799 if (_gt(_div(_abs(_sub(get_est_weight(t), old_estimate)),
793 get_est_weight(t)), 800 get_est_weight(t)),
794 task_error_threshold)) { 801 task_error_threshold)) {
diff --git a/kernel/sched_edf_hsb.c b/kernel/sched_edf_hsb.c
index 075d61c024..c2a4c6c679 100644
--- a/kernel/sched_edf_hsb.c
+++ b/kernel/sched_edf_hsb.c
@@ -1626,7 +1626,7 @@ static int hsb_mode_change(int new_mode)
1626} 1626}
1627 1627
1628 1628
1629typedef enum { 1629typedef enum {
1630 EDF_HSB_SET_HRT, 1630 EDF_HSB_SET_HRT,
1631 EDF_HSB_GET_HRT, 1631 EDF_HSB_GET_HRT,
1632 EDF_HSB_CREATE_BE 1632 EDF_HSB_CREATE_BE