Index: MM-2.6.X/kernel/sched.c =================================================================== --- MM-2.6.X.orig/kernel/sched.c 2006-01-12 10:44:50.000000000 +1100 +++ MM-2.6.X/kernel/sched.c 2006-01-12 10:47:01.000000000 +1100 @@ -2052,6 +2052,7 @@ find_busiest_group(struct sched_domain * unsigned long load; int local_group; int i; + unsigned int eligible_qs = 0; local_group = cpu_isset(this_cpu, group->cpumask); @@ -2065,8 +2066,11 @@ find_busiest_group(struct sched_domain * /* Bias balancing toward cpus of our domain */ if (local_group) load = target_load(i, load_idx); - else + else { load = source_load(i, load_idx); + if (cpu_rq(i)->nr_running > 1) + ++eligible_qs; + } avg_load += load; } @@ -2080,7 +2084,7 @@ find_busiest_group(struct sched_domain * if (local_group) { this_load = avg_load; this = group; - } else if (avg_load > max_load) { + } else if (avg_load > max_load && eligible_qs) { max_load = avg_load; busiest = group; } @@ -2181,8 +2185,12 @@ static runqueue_t *find_busiest_queue(st load = source_load(i, 0); if (load > max_load) { - max_load = load; - busiest = cpu_rq(i); + runqueue_t *tmprq = cpu_rq(i); + + if (tmprq->nr_running > 1) { + max_load = load; + busiest = tmprq; + } } }