Files
rockchip-kernel/include/linux
Oleg Nesterov 233e7f267e stop_machine: Ensure that a queued callback will be called before cpu_stop_park()
cpu_stop_queue_work() checks stopper->enabled before it queues the
work, but ->enabled == T can only guarantee cpu_stop_signal_done()
if we race with cpu_down().

This is not enough for stop_two_cpus() or stop_machine(), they will
deadlock if multi_cpu_stop() won't be called by one of the target
CPU's. stop_machine/stop_cpus are fine, they rely on stop_cpus_mutex.
But stop_two_cpus() has to check cpu_active() to avoid the same race
with hotplug, and this check is very unobvious and probably not even
correct if we race with cpu_up().

Change cpu_down() pass to clear ->enabled before cpu_stopper_thread()
flushes the pending ->works and returns with KTHREAD_SHOULD_PARK set.

Note also that smpboot_thread_call() calls cpu_stop_unpark() which
sets enabled == T at CPU_ONLINE stage, so this CPU can't go away until
cpu_stopper_thread() is called at least once. This all means that if
cpu_stop_queue_work() succeeds, we know that work->fn() will be called.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: heiko.carstens@de.ibm.com
Link: http://lkml.kernel.org/r/20151008145131.GA18139@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2015-10-20 10:23:53 +02:00
..
2015-06-25 11:49:31 +03:00
2015-09-16 20:44:47 +01:00
2015-05-13 12:04:55 -05:00
2015-08-03 12:01:54 -04:00
2015-08-06 16:17:25 -04:00
2015-09-04 16:54:41 -07:00
2015-09-08 15:35:28 -07:00
2015-08-20 10:20:11 +03:00
2015-06-24 17:49:45 -07:00
2015-07-17 08:41:53 -06:00
2015-05-12 10:46:53 +02:00
2015-06-01 14:33:35 +02:00
2015-06-19 15:18:28 +02:00
2015-09-08 15:35:28 -07:00
2015-09-08 15:35:28 -07:00
2015-05-05 13:40:42 -06:00
2015-08-27 19:40:58 -04:00
2015-06-25 12:06:45 +02:00
2015-08-18 15:49:15 -07:00
2015-07-28 08:50:42 +01:00
2015-09-06 16:27:10 +02:00
2015-04-29 17:17:17 -05:00
2015-10-01 21:42:35 -04:00
2015-04-14 16:49:05 -07:00
2015-06-24 17:49:41 -07:00
2015-10-01 21:42:35 -04:00
2015-07-21 10:39:05 -07:00
2015-06-25 04:20:04 -04:00
2015-08-17 13:32:56 -05:00
2015-08-18 11:56:13 -06:00
2015-09-10 13:29:01 -07:00
2015-09-10 13:29:01 -07:00
2015-09-10 13:29:01 -07:00
2015-09-08 15:35:28 -07:00
2015-04-12 21:03:31 +02:00
2015-09-24 23:04:53 -07:00
2015-06-19 01:18:14 +02:00
2015-10-06 17:08:19 +02:00
2015-08-17 15:40:20 +02:00
2015-06-10 19:14:04 +08:00
2015-05-27 12:58:04 -07:00
2015-05-26 15:23:23 +02:00
2015-06-25 01:13:43 +02:00
2015-04-11 15:53:35 -04:00
2015-09-10 15:36:59 -04:00
2015-06-25 17:00:39 -07:00
2015-08-17 11:25:28 -07:00
2015-07-22 15:27:29 -07:00
2015-08-28 16:27:27 -07:00
2015-04-11 22:29:44 -04:00
2015-06-12 17:26:57 -07:00
2015-09-08 15:35:28 -07:00
2015-09-10 13:29:01 -07:00