projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
5ccac88
)
[PATCH] workqueue: fix schedule_on_each_cpu()
author
Ingo Molnar
<mingo@elte.hu>
Mon, 18 Dec 2006 19:05:09 +0000
(20:05 +0100)
committer
Linus Torvalds
<torvalds@woody.osdl.org>
Thu, 21 Dec 2006 08:20:01 +0000
(
00:20
-0800)
fix the schedule_on_each_cpu() implementation: __queue_work() is now
stricter, hence set the work-pending bit before passing in the new work.
(found in the -rt tree, using Peter Zijlstra's files-lock scalability
patchset)
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
kernel/workqueue.c
patch
|
blob
|
history
diff --git
a/kernel/workqueue.c
b/kernel/workqueue.c
index 742cbbe49bdc66ca9f39908af1bda5baed8194c6..180a8ce115356909e66e5f0e444b65eec6ba914b 100644
(file)
--- a/
kernel/workqueue.c
+++ b/
kernel/workqueue.c
@@
-637,9
+637,11
@@
int schedule_on_each_cpu(work_func_t func)
mutex_lock(&workqueue_mutex);
for_each_online_cpu(cpu) {
- INIT_WORK(per_cpu_ptr(works, cpu), func);
- __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu),
- per_cpu_ptr(works, cpu));
+ struct work_struct *work = per_cpu_ptr(works, cpu);
+
+ INIT_WORK(work, func);
+ set_bit(WORK_STRUCT_PENDING, work_data_bits(work));
+ __queue_work(per_cpu_ptr(keventd_wq->cpu_wq, cpu), work);
}
mutex_unlock(&workqueue_mutex);
flush_workqueue(keventd_wq);