android_kernel_google_msm/include
Thomas Gleixner abd57a700e stop_machine: Mark per cpu stopper enabled early
commit 14e568e78 (stop_machine: Use smpboot threads) introduced the
following regression:

Before this commit the stopper enabled bit was set in the online
notifier.

CPU0				CPU1
cpu_up
				cpu online
hotplug_notifier(ONLINE)
  stopper(CPU1)->enabled = true;
...
stop_machine()

The conversion to smpboot threads moved the enablement to the wakeup
path of the parked thread. The majority of users seem to have the
following working order:

CPU0				CPU1
cpu_up
				cpu online
unpark_threads()
  wakeup(stopper[CPU1])
....
				stopper thread runs
				  stopper(CPU1)->enabled = true;
stop_machine()

But Konrad and Sander have observed:

CPU0				CPU1
cpu_up
				cpu online
unpark_threads()
  wakeup(stopper[CPU1])
....
stop_machine()
				stopper thread runs
				  stopper(CPU1)->enabled = true;

Now the stop machinery kicks CPU0 into the stop loop, where it gets
stuck forever because the queue code saw stopper(CPU1)->enabled ==
false, so CPU0 waits for CPU1 to enter stomp_machine, but the CPU1
stopper work got discarded due to enabled == false.

Add a pre_unpark function to the smpboot thread descriptor and call it
before waking the thread.

This fixes the problem at hand, but the stop_machine code should be
more robust. The stopper->enabled flag smells fishy at best.

Thanks to Konrad for going through a loop of debug patches and
providing the information to decode this issue.

Change-Id: I636875cf71ea5c5315eb0eb8599a8ebb9eadabf8
Reported-and-tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reported-and-tested-by: Sander Eikelenboom <linux@eikelenboom.it>
Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1302261843240.22263@ionos
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
2016-10-29 23:12:39 +08:00
..
acpi
asm-generic crypto: create generic version of ablk_helper 2016-10-29 23:12:13 +08:00
crypto crypto: sha512 - Expose generic sha512 routine to be callable from other modules 2016-10-29 23:12:14 +08:00
drm
keys KEYS: Permit in-place link replacement in keyring list 2016-10-29 23:12:12 +08:00
linux stop_machine: Mark per cpu stopper enabled early 2016-10-29 23:12:39 +08:00
math-emu
media Fix header list when building with Android 2016-10-29 23:12:09 +08:00
misc
mtd
net ipv6: clean up anycast when an interface is destroyed 2016-10-29 23:12:33 +08:00
pcmcia
rdma
rxrpc
scsi
sound
target
trace f2fs: trace old block address for CoWed page 2016-10-29 23:12:32 +08:00
video
xen
Kbuild