From: Oleg Nesterov Change schedule_on_each_cpu() to use flush_work() instead of flush_workqueue(), this way we don't wait for other work_struct's which can be queued meanwhile. Signed-off-by: Oleg Nesterov Cc: Jarek Poplawski Cc: Max Krasnyansky Cc: Peter Zijlstra Signed-off-by: Andrew Morton --- kernel/workqueue.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff -puN kernel/workqueue.c~workqueues-schedule_on_each_cpu-use-flush_work kernel/workqueue.c --- a/kernel/workqueue.c~workqueues-schedule_on_each_cpu-use-flush_work +++ a/kernel/workqueue.c @@ -653,7 +653,8 @@ int schedule_on_each_cpu(work_func_t fun set_bit(WORK_STRUCT_PENDING, work_data_bits(work)); __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), work); } - flush_workqueue(keventd_wq); + for_each_online_cpu(cpu) + flush_work(per_cpu_ptr(works, cpu)); put_online_cpus(); free_percpu(works); return 0; _