diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-09-25 23:39:08 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2007-09-25 23:39:08 -0400 |
commit | f22378cdfc858e4244bb696ed23b25b089cf4383 (patch) | |
tree | fee9b317e30054504ef566ff482664d455fcd213 /kernel | |
parent | 4aa0901b8c5c9b89ff804a8087037ff0e3c8ca88 (diff) |
bugfix: don't forget to requeue linked task at the end of RT mode
This caused RT tasks to get lost.
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_gsn_edf.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/sched_gsn_edf.c b/kernel/sched_gsn_edf.c index 948d2b4dc3..293dd5d532 100644 --- a/kernel/sched_gsn_edf.c +++ b/kernel/sched_gsn_edf.c | |||
@@ -424,8 +424,10 @@ static int gsnedf_schedule(struct task_struct * prev, | |||
424 | struct task_struct ** next, | 424 | struct task_struct ** next, |
425 | runqueue_t * rq) | 425 | runqueue_t * rq) |
426 | { | 426 | { |
427 | cpu_entry_t* entry = &__get_cpu_var(gsnedf_cpu_entries); | 427 | cpu_entry_t* entry = &__get_cpu_var(gsnedf_cpu_entries); |
428 | int out_of_time, sleep, preempt, np, exists, rt, blocks; | 428 | int out_of_time, sleep, preempt, np, exists, |
429 | rt, blocks; | ||
430 | struct task_struct* linked; | ||
429 | 431 | ||
430 | /* Will be released in finish_switch. */ | 432 | /* Will be released in finish_switch. */ |
431 | queue_lock(&gsnedf_lock); | 433 | queue_lock(&gsnedf_lock); |
@@ -468,11 +470,14 @@ static int gsnedf_schedule(struct task_struct * prev, | |||
468 | 470 | ||
469 | /* Stop real-time tasks when we leave real-time mode | 471 | /* Stop real-time tasks when we leave real-time mode |
470 | */ | 472 | */ |
471 | if (!rt && entry->linked) | 473 | if (!rt && entry->linked) { |
472 | /* task will be preempted once it is preemptable | 474 | /* task will be preempted once it is preemptable |
473 | * (which it may be now already) | 475 | * (which it may be already) |
474 | */ | 476 | */ |
475 | unlink(entry->linked); | 477 | linked = entry->linked; |
478 | unlink(linked); | ||
479 | requeue(linked); | ||
480 | } | ||
476 | 481 | ||
477 | /* Link pending task if we became unlinked. | 482 | /* Link pending task if we became unlinked. |
478 | */ | 483 | */ |