diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-04-24 12:11:36 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-04-24 12:11:36 -0400 |
commit | 332257053f1e004a8f46d64bbea9ce8b2522e0df (patch) | |
tree | 3160749425c12cb6868656953d7d64ff2cf4681f | |
parent | 0d59225b505708c1e3ec69392a9cfa109d6610b5 (diff) |
GQ-EDF: release master support.
Basically same as G-EDF.
-rw-r--r-- | litmus/sched_gq_edf.c | 29 |
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 | } |