From: Nick Piggin The SMT wake_idle code really wants to look at a non-local CPU's domain in order to check for idle siblings. So change the domain attachment code a little bit so we continue to hold a runqueue's lock while attaching a new domain. This means the locking rules have changed to: you may access your own domain without any lock, you must hold a remote runqueue's lock in order to view its domain. --- 25-akpm/kernel/sched.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff -puN kernel/sched.c~sched-smt-domain-race kernel/sched.c --- 25/kernel/sched.c~sched-smt-domain-race 2004-04-29 00:28:02.004798336 -0700 +++ 25-akpm/kernel/sched.c 2004-04-29 00:28:02.020795904 -0700 @@ -3399,18 +3399,18 @@ static int migration_thread(void * data) req = list_entry(head->next, migration_req_t, list); list_del_init(head->next); - spin_unlock(&rq->lock); - if (req->type == REQ_MOVE_TASK) { + spin_unlock(&rq->lock); __migrate_task(req->task, req->dest_cpu); + local_irq_enable(); } else if (req->type == REQ_SET_DOMAIN) { rq->sd = req->sd; + spin_unlock_irq(&rq->lock); } else { + spin_unlock_irq(&rq->lock); WARN_ON(1); } - local_irq_enable(); - complete(&req->done); } return 0; _