aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2009-05-02 21:58:35 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2009-05-02 21:58:35 -0400
commit812251a109b77301a7d4376dc42ffc04c20f315c (patch)
tree00d2126d6f0e3cff133fe330fe304828b1745bac
parent588411e07c2c93456d29904b813c05553db88559 (diff)
GQ-EDF: don't put running tasks in to released queue (bugfix)
-rw-r--r--litmus/sched_gq_edf.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/litmus/sched_gq_edf.c b/litmus/sched_gq_edf.c
index 9a969a2786..f27bf51341 100644
--- a/litmus/sched_gq_edf.c
+++ b/litmus/sched_gq_edf.c
@@ -410,30 +410,42 @@ static void gq_finish_switch(struct task_struct *prev)
410 */ 410 */
411static void gq_task_new(struct task_struct * t, int on_rq, int running) 411static void gq_task_new(struct task_struct * t, int on_rq, int running)
412{ 412{
413 unsigned long flags; 413 unsigned long flags;
414 cpu_state_t* entry; 414 cpu_state_t* entry;
415 415 int on_rm = 0;
416 TRACE("gq edf: task new %d\n", t->pid);
417 416
418 spin_lock_irqsave(&gq_lock, flags); 417 spin_lock_irqsave(&gq_lock, flags);
418
419 /* setup job params */
420 release_at(t, litmus_clock());
421
419 if (running) { 422 if (running) {
420 entry = &per_cpu(gq_cpu_entries, task_cpu(t)); 423 entry = &per_cpu(gq_cpu_entries, task_cpu(t));
421 BUG_ON(entry->scheduled); 424 BUG_ON(entry->scheduled);
425 on_rm = entry->cpu == gqedf.release_master;
426 }
427
428 TRACE_TASK(t, "gq edf: task new (running:%d on_rm:%d)\n",
429 running, on_rm);
430
431 if (running && on_rm)
422 set_tsk_need_resched(t); 432 set_tsk_need_resched(t);
423 if (entry->cpu != gqedf.release_master) {
424 tsk_rt(t)->scheduled_on = task_cpu(t);
425 entry->scheduled = t;
426 } else
427 tsk_rt(t)->scheduled_on = NO_CPU;
428 } else
429 tsk_rt(t)->scheduled_on = NO_CPU;
430 tsk_rt(t)->linked_on = NO_CPU;
431 433
432 /* setup job params */ 434 if (running && !on_rm) {
433 release_at(t, litmus_clock()); 435 /* just leave it where it is, CPU was real-time idle */
436 tsk_rt(t)->scheduled_on = task_cpu(t);
437 tsk_rt(t)->linked_on = task_cpu(t);
438 entry->linked = t;
439 entry->scheduled = t;
440 }
441
442 if (!running || on_rm) {
443 /* should be released properly */
444 tsk_rt(t)->scheduled_on = NO_CPU;
445 tsk_rt(t)->linked_on = NO_CPU;
446 gq_add_released_queue(t);
447 }
434 448
435 gq_add_released_queue(t);
436
437 spin_unlock_irqrestore(&gq_lock, flags); 449 spin_unlock_irqrestore(&gq_lock, flags);
438} 450}
439 451