diff options
author | Christopher Kenna <cjk@cs.unc.edu> | 2011-09-27 14:07:52 -0400 |
---|---|---|
committer | Christopher Kenna <cjk@cs.unc.edu> | 2011-09-27 14:07:52 -0400 |
commit | 609c45f71b7a2405230fd2f8436837d6389ec599 (patch) | |
tree | 65acaac84534301f9e7cbdb1e8a5e491b511c9e1 /litmus/sched_mc.c | |
parent | 46bb1ecb861729ebc3ac1631b6a7f7b131db86ac (diff) |
Debugged ghosts in the MC scheduler for CE tasks.
Diffstat (limited to 'litmus/sched_mc.c')
-rw-r--r-- | litmus/sched_mc.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c index 11ba10a54f4d..afba6e44716f 100644 --- a/litmus/sched_mc.c +++ b/litmus/sched_mc.c | |||
@@ -407,6 +407,7 @@ void mc_check_for_preempt(domain_t *dom) | |||
407 | preempt(dom, ce); | 407 | preempt(dom, ce); |
408 | update_crit_levels(entry); | 408 | update_crit_levels(entry); |
409 | } else { | 409 | } else { |
410 | TRACE("domain: %s NOT preempting\n", dom->name); | ||
410 | raw_spin_unlock(&entry->lock); | 411 | raw_spin_unlock(&entry->lock); |
411 | } | 412 | } |
412 | } | 413 | } |
@@ -545,27 +546,37 @@ static enum hrtimer_restart ce_timer_function(struct hrtimer *timer) | |||
545 | 546 | ||
546 | TRACE("MC level-A timer callback for CPU %d\n", ce_data->cpu); | 547 | TRACE("MC level-A timer callback for CPU %d\n", ce_data->cpu); |
547 | 548 | ||
548 | raw_spin_lock_irqsave(dom->lock, flags); | 549 | local_irq_save(flags); |
550 | |||
551 | raw_spin_lock(dom->lock); | ||
549 | 552 | ||
550 | raw_spin_lock(&crit_cpu(ce)->lock); | 553 | raw_spin_lock(&crit_cpu(ce)->lock); |
551 | if (ce->linked && | 554 | if (ce->linked && |
552 | ce->linked == ce_data->should_schedule && | 555 | ce->linked == ce_data->should_schedule && |
553 | is_ghost(ce->linked)) | 556 | is_ghost(ce->linked)) |
554 | { | 557 | { |
555 | update_ghost_time(ce->linked); | 558 | old_link = ce->linked; |
556 | if (tsk_mc_data(ce->linked)->mc_job.ghost_budget == 0) { | 559 | tsk_mc_data(ce->linked)->mc_job.ghost_budget = 0; |
557 | old_link = ce->linked; | 560 | link_task_to_crit(ce, NULL); |
558 | link_task_to_crit(ce, NULL); | ||
559 | } | ||
560 | } | 561 | } |
561 | raw_spin_unlock(&crit_cpu(ce)->lock); | 562 | raw_spin_unlock(&crit_cpu(ce)->lock); |
562 | 563 | ||
563 | if (NULL != old_link) | 564 | mc_ce_timer_callback_common(dom, timer); |
565 | |||
566 | /* job completion will check for preemptions by means of calling job | ||
567 | * arrival if the task is not blocked */ | ||
568 | if (NULL != old_link) { | ||
569 | TRACE(" old_link " TS " so will call job completion\n", TA(old_link)); | ||
570 | raw_spin_unlock(dom->lock); | ||
564 | job_completion(old_link, 0); | 571 | job_completion(old_link, 0); |
572 | } else { | ||
573 | TRACE(" old_link was null, so will call check for preempt\n"); | ||
574 | raw_spin_unlock(dom->lock); | ||
575 | mc_check_for_preempt(dom); | ||
576 | } | ||
577 | |||
578 | local_irq_restore(flags); | ||
565 | 579 | ||
566 | mc_ce_timer_callback_common(dom, timer); | ||
567 | mc_check_for_preempt(dom); | ||
568 | raw_spin_unlock_irqrestore(dom->lock, flags); | ||
569 | return HRTIMER_RESTART; | 580 | return HRTIMER_RESTART; |
570 | } | 581 | } |
571 | 582 | ||