From 334e08aeedcab61faca6be333e065c33098a8cda Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Fri, 23 Sep 2011 11:24:09 -0400 Subject: Checkpoint commit for work redistribution --- litmus/sched_mc.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/litmus/sched_mc.c b/litmus/sched_mc.c index fa2cd7ee606b..6ece904ff257 100644 --- a/litmus/sched_mc.c +++ b/litmus/sched_mc.c @@ -83,6 +83,7 @@ static int interrupt_cpu; #define domain_data(dom) (container_of(dom, domain_data_t, domain)) #define is_global(dom) (domain_data(dom)->heap) #define is_global_task(t) (is_global(get_task_domain(t))) +#define is_in_list(t) (tsk_rt(t)->list.next != tsk_rt(t)->list) #define can_requeue(t) \ (!is_global_task(t) || (t)->rt_param.scheduled_on == NO_CPU) #define entry_level(e) \ @@ -243,10 +244,11 @@ static void job_arrival(struct task_struct *task) TRACE_TASK(task, "Job arriving"); BUG_ON(!task); - raw_spin_lock(dom->lock); if (can_requeue(task)) { + raw_spin_lock(dom->lock); dom->requeue(dom, task); check_for_preempt(dom); + raw_spin_unlock(dom->lock); } else { /* If a global task is scheduled on one cpu, it CANNOT * be requeued into a global domain. Another cpu might @@ -256,9 +258,10 @@ static void job_arrival(struct task_struct *task) */ TRACE_TASK(task, "Delayed arrival of scheduled task"); } - raw_spin_unlock(dom->lock); } +static void 1 + /** * link_task_to_cpu() - Logically run a task on a CPU. * The task must first have been linked to one of the CPU's crit_entries. @@ -320,12 +323,15 @@ static void fix_global_levels(void) struct list_head *pos, *safe; struct task_struct *t; + TRACE("Fixing global levels\n"); for_each_online_cpu(c) { e = cpus[c]; raw_spin_lock(&e->redir_lock); list_for_each_safe(pos, safe, &e->redir) { t = list_entry(pos, struct task_struct, rt_param.list); - list_del(pos); + TRACE_TASK(t, "Arriving yo"); + BUG_ON(is_queued(t)); + list_del_init(pos); job_arrival(t); } raw_spin_unlock(&e->redir_lock); @@ -361,20 +367,7 @@ static void update_crit_levels(cpu_entry_t *entry) ce = &entry->crit_entries[i]; TRACE("Checking %s\n", ce->domain->name); if (!tasks[i]) continue; -#ifdef CONFIG_PLUGIN_MC_REDIRECT -#ifndef CONFIG_PLUGIN_MC_REDIRECT_ALL - if (!is_global_task(tasks[i])) - job_arrival(tasks[i]); - else -#endif - { - raw_spin_lock(&entry->redir_lock); - list_add(&tsk_rt(tasks[i])->list, &entry->redir); - raw_spin_unlock(&entry->redir_lock); - } -#else job_arrival(tasks[i]); -#endif } } -- cgit v1.2.2