workqueue: fix race condition in schedule_on_each_cpu()
authorTejun Heo <tj@kernel.org>
Tue, 17 Nov 2009 22:06:20 +0000 (14:06 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Nov 2009 01:40:33 +0000 (17:40 -0800)
commit9398180097e359646d46083c3e079a54e20bee82
tree633933ddd86e3dba7c0970eea5768867849842c9
parente13193319d3a5545c82ed4b724bffd16f87873e3
workqueue: fix race condition in schedule_on_each_cpu()

Commit 65a64464349883891e21e74af16c05d6e1eeb4e9 ("HWPOISON: Allow
schedule_on_each_cpu() from keventd") which allows schedule_on_each_cpu()
to be called from keventd added a race condition.  schedule_on_each_cpu()
may race with cpu hotplug and end up executing the function twice on a
cpu.

Fix it by moving direct execution into the section protected with
get/put_online_cpus().  While at it, update code such that direct
execution is done after works have been scheduled for all other cpus and
drop unnecessary cpu != orig test from flush loop.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
kernel/workqueue.c