diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-02 21:58:35 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-02 21:58:35 -0400 |
commit | 812251a109b77301a7d4376dc42ffc04c20f315c (patch) | |
tree | 00d2126d6f0e3cff133fe330fe304828b1745bac | |
parent | 588411e07c2c93456d29904b813c05553db88559 (diff) |
GQ-EDF: don't put running tasks in to released queue (bugfix)
-rw-r--r-- | litmus/sched_gq_edf.c | 44 |
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 | */ |
411 | static void gq_task_new(struct task_struct * t, int on_rq, int running) | 411 | static 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 | ||