aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2009-04-24 12:11:36 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2009-04-24 12:11:36 -0400
commit332257053f1e004a8f46d64bbea9ce8b2522e0df (patch)
tree3160749425c12cb6868656953d7d64ff2cf4681f
parent0d59225b505708c1e3ec69392a9cfa109d6610b5 (diff)
GQ-EDF: release master support.
Basically same as G-EDF.
-rw-r--r--litmus/sched_gq_edf.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/litmus/sched_gq_edf.c b/litmus/sched_gq_edf.c
index b4023f9660..9a969a2786 100644
--- a/litmus/sched_gq_edf.c
+++ b/litmus/sched_gq_edf.c
@@ -304,6 +304,12 @@ static struct task_struct* gq_schedule(struct task_struct * prev)
304 int sleep, preempt, exists, blocks, out_of_time; 304 int sleep, preempt, exists, blocks, out_of_time;
305 struct task_struct* next = NULL; 305 struct task_struct* next = NULL;
306 306
307 /* Bail out early if we are the release master.
308 * The release master never schedules any real-time tasks.
309 */
310 if (gqedf.release_master == entry->cpu)
311 return NULL;
312
307 spin_lock(&gq_lock); 313 spin_lock(&gq_lock);
308 314
309 /* sanity checking */ 315 /* sanity checking */
@@ -407,18 +413,21 @@ static void gq_task_new(struct task_struct * t, int on_rq, int running)
407 unsigned long flags; 413 unsigned long flags;
408 cpu_state_t* entry; 414 cpu_state_t* entry;
409 415
410 TRACE("gsn edf: task new %d\n", t->pid); 416 TRACE("gq edf: task new %d\n", t->pid);
411 417
412 spin_lock_irqsave(&gq_lock, flags); 418 spin_lock_irqsave(&gq_lock, flags);
413 if (running) { 419 if (running) {
414 entry = &per_cpu(gq_cpu_entries, task_cpu(t)); 420 entry = &per_cpu(gq_cpu_entries, task_cpu(t));
415 BUG_ON(entry->scheduled); 421 BUG_ON(entry->scheduled);
416 entry->scheduled = t;
417 t->rt_param.scheduled_on = task_cpu(t);
418 set_tsk_need_resched(t); 422 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;
419 } else 428 } else
420 t->rt_param.scheduled_on = NO_CPU; 429 tsk_rt(t)->scheduled_on = NO_CPU;
421 t->rt_param.linked_on = NO_CPU; 430 tsk_rt(t)->linked_on = NO_CPU;
422 431
423 /* setup job params */ 432 /* setup job params */
424 release_at(t, litmus_clock()); 433 release_at(t, litmus_clock());
@@ -521,15 +530,21 @@ static long gq_activate_plugin(void)
521 530
522 heap_init(&gq_cpu_heap); 531 heap_init(&gq_cpu_heap);
523 heap_init(&gq_released_heap); 532 heap_init(&gq_released_heap);
533 gqedf.release_master = atomic_read(&release_master_cpu);
534
524 535
525 for_each_online_cpu(cpu) { 536 for_each_online_cpu(cpu) {
526 TRACE("GQ: Initializing CPU #%d.\n", cpu);
527 entry = &per_cpu(gq_cpu_entries, cpu); 537 entry = &per_cpu(gq_cpu_entries, cpu);
528 heap_node_init(&entry->hn, entry); 538 heap_node_init(&entry->hn, entry);
529 entry->linked = NULL; 539 entry->linked = NULL;
530 entry->scheduled = NULL; 540 entry->scheduled = NULL;
531 entry->absentee = NULL; 541 entry->absentee = NULL;
532 update_cpu_position(entry); 542 if (cpu != gqedf.release_master) {
543 TRACE("GQ-EDF: Initializing CPU #%d.\n", cpu);
544 update_cpu_position(entry);
545 } else {
546 TRACE("GQ-EDF: CPU %d is release master.\n", cpu);
547 }
533 } 548 }
534 return 0; 549 return 0;
535} 550}