[PATCH] migration_thread preempt fix

From: Robert Love (rml@tech9.net)
Date: Mon Apr 15 2002 - 13:57:26 EST


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/



This archive was generated by hypermail 2b29 : Mon Apr 15 2002 - 22:00:25 EST