aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-04 11:09:50 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2007-10-04 11:09:50 -0400
commitd74881ffa37434d2ce5455e9e2086292c6128d56 (patch)
treecebcbe62a38b643726542540cf56eef6f27d1e36 /kernel
parentf22378cdfc858e4244bb696ed23b25b089cf4383 (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.c34
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 */
735static 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
762static int gsnedf_mode_change(int new_mode) 732static 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, \