diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2009-01-16 15:31:15 -0800 |
---|---|---|
committer | Mike Travis <travis@sgi.com> | 2009-01-16 15:31:15 -0800 |
commit | e1d9ec6246a2668a5d037f529877efb7cf176af8 (patch) | |
tree | 58873891cffbb657cf7820ff0a32f03eea830f80 | |
parent | 68564a46976017496c2227660930d81240f82355 (diff) | |
download | linux-e1d9ec6246a2668a5d037f529877efb7cf176af8.tar.gz linux-e1d9ec6246a2668a5d037f529877efb7cf176af8.tar.bz2 linux-e1d9ec6246a2668a5d037f529877efb7cf176af8.zip |
work_on_cpu: Use our own workqueue.
Impact: remove potential clashes with generic kevent workqueue
Annoyingly, some places we want to use work_on_cpu are already in
workqueues. As per Ingo's suggestion, we create a different workqueue
for work_on_cpu.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Mike Travis <travis@sgi.com>
-rw-r--r-- | kernel/workqueue.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index a35afdbc0161..1f0c509b40d3 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -971,6 +971,8 @@ undo: } #ifdef CONFIG_SMP +static struct workqueue_struct *work_on_cpu_wq __read_mostly; + struct work_for_cpu { struct work_struct work; long (*fn)(void *); @@ -1001,7 +1003,7 @@ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) INIT_WORK(&wfc.work, do_work_for_cpu); wfc.fn = fn; wfc.arg = arg; - schedule_work_on(cpu, &wfc.work); + queue_work_on(cpu, work_on_cpu_wq, &wfc.work); flush_work(&wfc.work); return wfc.ret; @@ -1019,4 +1021,8 @@ void __init init_workqueues(void) hotcpu_notifier(workqueue_cpu_callback, 0); keventd_wq = create_workqueue("events"); BUG_ON(!keventd_wq); +#ifdef CONFIG_SMP + work_on_cpu_wq = create_workqueue("work_on_cpu"); + BUG_ON(!work_on_cpu_wq); +#endif } |