
From: Nick Piggin <nickpiggin@yahoo.com.au>


Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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;
 	}
_
