The block layer needs the ability to queue unplug work so that it will execute on a CPU other than the current one. --- 25-akpm/include/linux/workqueue.h | 4 +++- 25-akpm/kernel/workqueue.c | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff -puN kernel/workqueue.c~queue_work_on_cpu kernel/workqueue.c --- 25/kernel/workqueue.c~queue_work_on_cpu Fri Mar 12 11:27:07 2004 +++ 25-akpm/kernel/workqueue.c Fri Mar 12 11:27:07 2004 @@ -78,18 +78,29 @@ static void __queue_work(struct cpu_work * We queue the work to the CPU it was submitted, but there is no * guarantee that it will be processed by that CPU. */ -int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work) +int queue_work_on_cpu(struct workqueue_struct *wq, + struct work_struct *work, int cpu) { - int ret = 0, cpu = get_cpu(); + int ret = 0; if (!test_and_set_bit(0, &work->pending)) { BUG_ON(!list_empty(&work->entry)); __queue_work(wq->cpu_wq + cpu, work); ret = 1; } + return ret; +} +EXPORT_SYMBOL_GPL(queue_work); + +int queue_work(struct workqueue_struct *wq, struct work_struct *work) +{ + int ret; + + ret = queue_work_on_cpu(wq, work, get_cpu()); put_cpu(); return ret; } +EXPORT_SYMBOL_GPL(queue_work_on_cpu); static void delayed_work_timer_fn(unsigned long __data) { @@ -353,7 +364,6 @@ void init_workqueues(void) } EXPORT_SYMBOL_GPL(create_workqueue); -EXPORT_SYMBOL_GPL(queue_work); EXPORT_SYMBOL_GPL(queue_delayed_work); EXPORT_SYMBOL_GPL(flush_workqueue); EXPORT_SYMBOL_GPL(destroy_workqueue); diff -puN include/linux/workqueue.h~queue_work_on_cpu include/linux/workqueue.h --- 25/include/linux/workqueue.h~queue_work_on_cpu Fri Mar 12 11:27:07 2004 +++ 25-akpm/include/linux/workqueue.h Fri Mar 12 11:27:07 2004 @@ -52,7 +52,9 @@ struct work_struct { extern struct workqueue_struct *create_workqueue(const char *name); extern void destroy_workqueue(struct workqueue_struct *wq); -extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); +int queue_work(struct workqueue_struct *wq, struct work_struct *work); +int queue_work_on_cpu(struct workqueue_struct *wq, + struct work_struct *work, int cpu); extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); _