]> err.no Git - linux-2.6/commitdiff
[PATCH] workqueue: fix schedule_on_each_cpu()
authorIngo Molnar <mingo@elte.hu>
Mon, 18 Dec 2006 19:05:09 +0000 (20:05 +0100)
committerLinus 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

index 742cbbe49bdc66ca9f39908af1bda5baed8194c6..180a8ce115356909e66e5f0e444b65eec6ba914b 100644 (file)
@@ -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);