diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-04 11:09:50 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-10-04 11:09:50 -0400 |
commit | d74881ffa37434d2ce5455e9e2086292c6128d56 (patch) | |
tree | cebcbe62a38b643726542540cf56eef6f27d1e36 /kernel | |
parent | f22378cdfc858e4244bb696ed23b25b089cf4383 (diff) |
Fix sleeping behavior.
A dublication of prepare_task_for_next_period() caused GSN-EDF to wrongly
calculate the next deadline of new jobs. This was fixed for the RTAS
experiments.
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_gsn_edf.c | 34 |
1 files changed, 2 insertions, 32 deletions
diff --git a/kernel/sched_gsn_edf.c b/kernel/sched_gsn_edf.c index 293dd5d532..5ff2670727 100644 --- a/kernel/sched_gsn_edf.c +++ b/kernel/sched_gsn_edf.c | |||
@@ -393,7 +393,7 @@ static noinline void job_completion(struct task_struct *t) | |||
393 | /* unlink */ | 393 | /* unlink */ |
394 | unlink(t); | 394 | unlink(t); |
395 | /* requeue | 395 | /* requeue |
396 | * But on't requeue a blocking task. */ | 396 | * But don't requeue a blocking task. */ |
397 | if (is_running(t)) | 397 | if (is_running(t)) |
398 | gsnedf_job_arrival(t); | 398 | gsnedf_job_arrival(t); |
399 | } | 399 | } |
@@ -729,36 +729,6 @@ static long gsnedf_return_priority(struct pi_semaphore *sem) | |||
729 | return ret; | 729 | return ret; |
730 | } | 730 | } |
731 | 731 | ||
732 | /* | ||
733 | * Deactivate current task until the beginning of the next period. | ||
734 | */ | ||
735 | static long gsnedf_sleep_next_period(void) | ||
736 | { | ||
737 | unsigned long flags; | ||
738 | struct task_struct* t = current; | ||
739 | |||
740 | queue_lock_irqsave(&gsnedf_lock, flags); | ||
741 | |||
742 | /* Mark that we do not excute anymore */ | ||
743 | set_rt_flags(t, RT_F_SLEEP); | ||
744 | sched_trace_job_completion(t); | ||
745 | /* prepare for next period */ | ||
746 | edf_prepare_for_next_period(t); | ||
747 | |||
748 | /* unlink */ | ||
749 | unlink(t); | ||
750 | /* requeue */ | ||
751 | gsnedf_job_arrival(t); | ||
752 | |||
753 | /* will reschedule on return to user mode */ | ||
754 | set_tsk_need_resched(t); | ||
755 | |||
756 | queue_unlock_irqrestore(&gsnedf_lock, flags); | ||
757 | |||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | |||
762 | static int gsnedf_mode_change(int new_mode) | 732 | static int gsnedf_mode_change(int new_mode) |
763 | { | 733 | { |
764 | unsigned long flags; | 734 | unsigned long flags; |
@@ -806,7 +776,7 @@ static sched_plugin_t s_plugin __cacheline_aligned_in_smp = { | |||
806 | .algo_scheduler_tick = gsnedf_scheduler_tick, \ | 776 | .algo_scheduler_tick = gsnedf_scheduler_tick, \ |
807 | .scheduler_tick = rt_scheduler_tick, \ | 777 | .scheduler_tick = rt_scheduler_tick, \ |
808 | .prepare_task = gsnedf_prepare_task, \ | 778 | .prepare_task = gsnedf_prepare_task, \ |
809 | .sleep_next_period = gsnedf_sleep_next_period, \ | 779 | .sleep_next_period = edf_sleep_next_period, \ |
810 | .tear_down = gsnedf_tear_down, \ | 780 | .tear_down = gsnedf_tear_down, \ |
811 | .schedule = gsnedf_schedule, \ | 781 | .schedule = gsnedf_schedule, \ |
812 | .finish_switch = gsnedf_finish_switch, \ | 782 | .finish_switch = gsnedf_finish_switch, \ |