From: Nick Piggin Signed-off-by: Andrew Morton --- 25-akpm/kernel/sched.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff -puN kernel/sched.c~sched-smt-fixes-fix kernel/sched.c --- 25/kernel/sched.c~sched-smt-fixes-fix 2004-08-21 23:45:45.652086264 -0700 +++ 25-akpm/kernel/sched.c 2004-08-21 23:45:45.662084744 -0700 @@ -2337,17 +2337,20 @@ static inline void idle_balance(int cpu, static inline int wake_priority_sleeper(runqueue_t *rq) { + int ret = 0; #ifdef CONFIG_SCHED_SMT + spin_lock(&rq->lock); /* * If an SMT sibling task has been put to sleep for priority * reasons reschedule the idle task to see if it can now run. */ if (rq->nr_running) { resched_task(rq->idle); - return 1; + ret = 1; } + spin_unlock(&rq->lock); #endif - return 0; + return ret; } DEFINE_PER_CPU(struct kernel_stat, kstat); @@ -2403,10 +2406,8 @@ void scheduler_tick(int user_ticks, int cpustat->iowait += sys_ticks; else cpustat->idle += sys_ticks; - spin_lock(&rq->lock); if (wake_priority_sleeper(rq)) - goto out_unlock; - spin_unlock(&rq->lock); + goto out; rebalance_tick(cpu, rq, IDLE); return; } _