|
@@ -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
|
|
|
}
|