[PATCH] migration_thread preempt fix

Robert Love (rml@tech9.net)
15 Apr 2002 14:57:26 -0400


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

diff -urN linux-2.5.8/kernel/sched.c linux/kernel/sched.c
--- linux-2.5.8/kernel/sched.c Sun Apr 14 15:18:47 2002
+++ linux/kernel/sched.c Mon Apr 15 14:47:18 2002
@@ -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;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/