[PATCH] stop_machine() vs. synchronous IPI send deadlock
authorKirill Korotaev <dev@sw.ru>
Mon, 14 Nov 2005 00:07:30 +0000 (16:07 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 14 Nov 2005 02:14:16 +0000 (18:14 -0800)
commit4557398f8cbaf9f254cff747534b4724c7f75c4f
tree052b59279b1312a4fde83a76feb4a7a0c5cf7df1
parentc5b609797b8e212dbfaf23944da8bf8c53233d5c
[PATCH] stop_machine() vs. synchronous IPI send deadlock

This fixes deadlock of stop_machine() vs.  synchronous IPI send.  The
problem is that stop_machine() disables interrupts before disabling
preemption on other CPUs.  So if another CPU is preempted and then calls
something like flush_tlb_all() it will deadlock with CPU doing
stop_machine() and which can't process IPI due to disabled IRQs.

I changed stop_machine() to do the same things exactly as it does on other
CPUs, i.e.  it should disable preemption first on _all_ CPUs including
itself and only after that disable IRQs.

Signed-off-by: Kirill Korotaev <dev@sw.ru>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: "Andrey Savochkin" <saw@sawoct.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
kernel/stop_machine.c