migration_thread preempt fix
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
@@ -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;