--- linux-2.6.9-rc3-mm2/kernel/sched.c 2004-10-05 15:17:09.157119322 +1000 +++ linux-2.6.9-rc3-mm2-mod/kernel/sched.c 2004-10-05 15:27:05.355561830 +1000 @@ -3240,18 +3240,21 @@ need_resched: put_task_in_sinbin(prev); cpu = smp_processor_id(); - if (unlikely(needs_idle_balance(rq))) { + if (unlikely(!rq->nr_running)) { go_idle: idle_balance(cpu, rq); - /* This code should get optimised away when CONFIG_SCHED_SMT - * is not defined - */ - if (dependent_idle(rq)) + if (!rq->nr_running) { + next = rq->idle; wake_sleeping_dependent(cpu, rq); + /* + * wake_sleeping_dependent() might have released + * the runqueue, so break out if we got new + * tasks meanwhile: + */ + if (!rq->nr_running) + goto switch_tasks; + } } else { - /* This code should all get optimised away when CONFIG_SCHED_SMT - * is not defined - */ if (dependent_sleeper(cpu, rq)) { schedstat_inc(rq, sched_goidle); next = rq->idle; @@ -3262,7 +3265,7 @@ go_idle: * lock, hence go into the idle loop if the rq went * empty meanwhile: */ - if (unlikely(recheck_needs_idle_balance(rq))) + if (unlikely(!rq->nr_running)) goto go_idle; }