mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] Fix Occasional stop_machine() Lockup with > 2 CPUs
@ 2004-11-30  4:42 Rusty Russell
  0 siblings, 0 replies; only message in thread
From: Rusty Russell @ 2004-11-30  4:42 UTC (permalink / raw)
  To: lkml - Kernel Mailing List
  Cc: Srivatsa Vaddagiri, lkml - Kernel Mailing List, Stephen Rothwell

Name: Fix Occasional stop_machine() Lockup
Status: Tested on 2.6.10-rc2-bk13
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

Stephen Rothwell noted a case where one CPU was sitting in userspace,
one in stop_machine() waiting for everyone to enter stopmachine().
This can happen if migration occurs at exactly the wrong time with
more than 2 CPUS.  Say we have 4 CPUS:

1) stop_machine() on CPU 0creates stopmachine() threads for CPUS 1, 2
   and 3, and yields waiting for them to migrate to their CPUs and
   ack.

2) stopmachine(2) gets rebalanced (probably on exec) to CPU 1.

3) stopmachine(2) calls set_cpus_allowed on CPU 1, sleeps awaiting
   migration thread.

4) stopmachine(1) calls set_cpus_allowed on CPU 0, moves onto CPU1 and
   starts spinning.

Now the migration thread never runs, and we deadlock.  The simplest
solution is for stopmachine() to yield until they are all in place.

Index: linux-2.6.10-rc2-bk13-Misc/kernel/stop_machine.c
===================================================================
--- linux-2.6.10-rc2-bk13-Misc.orig/kernel/stop_machine.c	2004-11-30 13:48:40.000000000 +1100
+++ linux-2.6.10-rc2-bk13-Misc/kernel/stop_machine.c	2004-11-30 14:07:00.089957464 +1100
@@ -52,7 +52,10 @@
 			mb(); /* Must read state first. */
 			atomic_inc(&stopmachine_thread_ack);
 		}
-		cpu_relax();
+		if (!prepared && !irqs_disabled)
+			yield();
+		else
+			cpu_relax();
 	}
 
 	/* Ack: we are exiting. */

-- 
A bad analogy is like a leaky screwdriver -- Richard Braakman


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-11-30  4:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-11-30  4:42 [PATCH] Fix Occasional stop_machine() Lockup with > 2 CPUs Rusty Russell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome