Skip to contentSkip to conversation

migration_thread preempt fix

PATCH New Robert Love 1 participant 1 message Apr 15, 2002

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 migration_thread preempt fix

Linus,

Attached is a resend of a patch to fix a race in migration_thread which results in a deadlock on boot for some SMP systems. The fix is to to disable preemption inside of set_cpus_allowed.

Andrew Morton first noticed the problem and provided the following patch a few weeks back. I was not affected until the recent migration_init fix, for some odd reason. Neither Andrew nor I think this is actually kernel preemption's fault but perhaps a race in the tricky behavior of the migration code.

Patch is against 2.5.8, please apply.

Robert Love

kernel/sched.c +4 -1
diff -urN linux-2.5.8/kernel/sched.c linux/kernel/sched.c
@@ -1649,6 +1649,7 @@
 	if (!new_mask)
 		BUG();
 
+	preempt_disable();
 	rq = task_rq_lock(p, &flags);
 	p->cpus_allowed = new_mask;
 	/*
@@ -1657,7 +1658,7 @@
 	 */
 	if (new_mask & (1UL << p->thread_info->cpu)) {
 		task_rq_unlock(rq, &flags);
-		return;
+		goto out;
 	}
 
 	init_MUTEX_LOCKED(&req.sem);
@@ -1667,6 +1668,8 @@
 	wake_up_process(rq->migration_thread);
 
 	down(&req.sem);
+out:
+	preempt_enable();
 }
 
 static volatile unsigned long migration_mask;