diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-04 23:31:28 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-04 23:31:28 -0400 |
commit | 3f35db6cadd8480dd7415f8c7dbf1c8bc74a4ca3 (patch) | |
tree | 1cbcad71df8dad891170a5397f7640e1784b471d | |
parent | 7e4891de3120ad67d3f4d7bb49aa6d251244993a (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.c | 4 | ||||
-rw-r--r-- | litmus/sched_ghq_edf.c | 4 | ||||
-rw-r--r-- | litmus/sched_gq_edf.c | 2 | ||||
-rw-r--r-- | litmus/sched_gsn_edf.c | 4 |
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 | } |