Index: linux-2.6.19-rc3/kernel/sched.c =================================================================== --- linux-2.6.19-rc3.orig/kernel/sched.c 2006-10-26 11:31:04.000000000 -0500 +++ linux-2.6.19-rc3/kernel/sched.c 2006-10-26 11:44:23.180223431 -0500 @@ -2855,7 +2855,6 @@ static void rebalance_domains(unsigned l { int this_cpu = smp_processor_id(); struct rq *this_rq = cpu_rq(this_cpu); - unsigned long interval; struct sched_domain *sd; /* Idle means on the idle queue without a runnable task */ enum idle_type idle = (this_rq->idle && !this_rq->nr_running) ? @@ -2867,16 +2866,9 @@ static void rebalance_domains(unsigned l if (!(sd->flags & SD_LOAD_BALANCE)) continue; - interval = sd->balance_interval; - if (idle != SCHED_IDLE) - interval *= sd->busy_factor; - - /* scale ms to jiffies */ - interval = msecs_to_jiffies(interval); - if (unlikely(!interval)) - interval = 1; - if (jiffies >= sd->next_balance) { + unsigned long interval; + if (load_balance(this_cpu, this_rq, sd, idle)) { /* * We've pulled tasks over so either we're no @@ -2885,6 +2877,14 @@ static void rebalance_domains(unsigned l */ idle = NOT_IDLE; } + interval = sd->balance_interval; + if (idle != SCHED_IDLE) + interval *= sd->busy_factor; + + /* scale ms to jiffies */ + interval = msecs_to_jiffies(interval); + if (unlikely(!interval)) + interval = 1; sd->next_balance += interval; } next_balance = min(next_balance, sd->next_balance);