aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2009-05-04 23:31:28 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2009-05-04 23:31:28 -0400
commit3f35db6cadd8480dd7415f8c7dbf1c8bc74a4ca3 (patch)
tree1cbcad71df8dad891170a5397f7640e1784b471d
parent7e4891de3120ad67d3f4d7bb49aa6d251244993a (diff)
EDF plugins: don't forget to preempt new tasks on release-master
This fixes a bug that lead to task stacks being used s simultaneously on two CPUs.
-rw-r--r--litmus/sched_gedf.c4
-rw-r--r--litmus/sched_ghq_edf.c4
-rw-r--r--litmus/sched_gq_edf.c2
-rw-r--r--litmus/sched_gsn_edf.c4
4 files changed, 10 insertions, 4 deletions
diff --git a/litmus/sched_gedf.c b/litmus/sched_gedf.c
index 5e139ae36b..9d07b1b73c 100644
--- a/litmus/sched_gedf.c
+++ b/litmus/sched_gedf.c
@@ -489,8 +489,10 @@ static void gedf_task_new(struct task_struct * t, int on_rq, int running)
489 if (entry->cpu != gedf.release_master) { 489 if (entry->cpu != gedf.release_master) {
490 entry->scheduled = t; 490 entry->scheduled = t;
491 t->rt_param.scheduled_on = task_cpu(t); 491 t->rt_param.scheduled_on = task_cpu(t);
492 } else 492 } else {
493 preempt(entry);
493 tsk_rt(t)->scheduled_on = NO_CPU; 494 tsk_rt(t)->scheduled_on = NO_CPU;
495 }
494 } else { 496 } else {
495 tsk_rt(t)->scheduled_on = NO_CPU; 497 tsk_rt(t)->scheduled_on = NO_CPU;
496 } 498 }
diff --git a/litmus/sched_ghq_edf.c b/litmus/sched_ghq_edf.c
index 621d515ccb..a9b1d06dd9 100644
--- a/litmus/sched_ghq_edf.c
+++ b/litmus/sched_ghq_edf.c
@@ -589,8 +589,10 @@ static void ghqedf_task_new(struct task_struct * t, int on_rq, int running)
589 if (entry->cpu != ghqedf.release_master) { 589 if (entry->cpu != ghqedf.release_master) {
590 entry->scheduled = t; 590 entry->scheduled = t;
591 t->rt_param.scheduled_on = task_cpu(t); 591 t->rt_param.scheduled_on = task_cpu(t);
592 } else 592 } else {
593 preempt(entry);
593 tsk_rt(t)->scheduled_on = NO_CPU; 594 tsk_rt(t)->scheduled_on = NO_CPU;
595 }
594 } else { 596 } else {
595 tsk_rt(t)->scheduled_on = NO_CPU; 597 tsk_rt(t)->scheduled_on = NO_CPU;
596 } 598 }
diff --git a/litmus/sched_gq_edf.c b/litmus/sched_gq_edf.c
index e675170cd2..7b6e8ddbe8 100644
--- a/litmus/sched_gq_edf.c
+++ b/litmus/sched_gq_edf.c
@@ -429,7 +429,7 @@ static void gq_task_new(struct task_struct * t, int on_rq, int running)
429 running, on_rm); 429 running, on_rm);
430 430
431 if (running && on_rm) 431 if (running && on_rm)
432 set_tsk_need_resched(t); 432 preempt(entry);
433 433
434 if (running && !on_rm) { 434 if (running && !on_rm) {
435 /* just leave it where it is, CPU was real-time idle */ 435 /* just leave it where it is, CPU was real-time idle */
diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c
index 0d24244bee..cbde657ce7 100644
--- a/litmus/sched_gsn_edf.c
+++ b/litmus/sched_gsn_edf.c
@@ -524,8 +524,10 @@ static void gsnedf_task_new(struct task_struct * t, int on_rq, int running)
524 if (entry->cpu != gsnedf.release_master) { 524 if (entry->cpu != gsnedf.release_master) {
525 entry->scheduled = t; 525 entry->scheduled = t;
526 tsk_rt(t)->scheduled_on = task_cpu(t); 526 tsk_rt(t)->scheduled_on = task_cpu(t);
527 } else 527 } else {
528 preempt(entry); /* force resched */
528 tsk_rt(t)->scheduled_on = NO_CPU; 529 tsk_rt(t)->scheduled_on = NO_CPU;
530 }
529 } else { 531 } else {
530 t->rt_param.scheduled_on = NO_CPU; 532 t->rt_param.scheduled_on = NO_CPU;
531 } 533 }