diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2008-07-25 04:47:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-25 13:53:40 -0400 |
commit | 8616a89ab761239c963eea3a63be383f127cc7e8 (patch) | |
tree | b74212be00198b64d0c3fcbf552e0e3ced01a350 /kernel/workqueue.c | |
parent | db700897224b5ebdf852f2d38920ce428940d059 (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/workqueue.c')
-rw-r--r-- | kernel/workqueue.c | 3 |
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; |