aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2008-07-25 04:47:49 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-25 13:53:40 -0400
commit8616a89ab761239c963eea3a63be383f127cc7e8 (patch)
treeb74212be00198b64d0c3fcbf552e0e3ced01a350 /kernel
parentdb700897224b5ebdf852f2d38920ce428940d059 (diff)
workqueues: schedule_on_each_cpu: use flush_work()
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 <oleg@tv-sign.ru> Cc: Jarek Poplawski <jarkao2@gmail.com> Cc: Max Krasnyansky <maxk@qualcomm.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/workqueue.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index ee41cf857d55..5fbffd302eb5 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -690,7 +690,8 @@ int schedule_on_each_cpu(work_func_t func)
690 set_bit(WORK_STRUCT_PENDING, work_data_bits(work)); 690 set_bit(WORK_STRUCT_PENDING, work_data_bits(work));
691 __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), work); 691 __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), work);
692 } 692 }
693 flush_workqueue(keventd_wq); 693 for_each_online_cpu(cpu)
694 flush_work(per_cpu_ptr(works, cpu));
694 put_online_cpus(); 695 put_online_cpus();
695 free_percpu(works); 696 free_percpu(works);
696 return 0; 697 return 0;