aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/sched_mc.c
diff options
context:
space:
mode:
authorChristopher Kenna <cjk@cs.unc.edu>2011-09-27 14:07:52 -0400
committerChristopher Kenna <cjk@cs.unc.edu>2011-09-27 14:07:52 -0400
commit609c45f71b7a2405230fd2f8436837d6389ec599 (patch)
tree65acaac84534301f9e7cbdb1e8a5e491b511c9e1 /litmus/sched_mc.c
parent46bb1ecb861729ebc3ac1631b6a7f7b131db86ac (diff)
Debugged ghosts in the MC scheduler for CE tasks.
Diffstat (limited to 'litmus/sched_mc.c')
-rw-r--r--litmus/sched_mc.c35
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