diff options
-rw-r--r-- | include/linux/workqueue.h | 2 | ||||
-rw-r--r-- | kernel/workqueue.c | 38 |
2 files changed, 25 insertions, 15 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 957c21c16d62..9bca3539a1e5 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -63,6 +63,8 @@ extern void destroy_workqueue(struct workqueue_struct *wq); | |||
63 | 63 | ||
64 | extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); | 64 | extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work)); |
65 | extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); | 65 | extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)); |
66 | extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | ||
67 | struct work_struct *work, unsigned long delay); | ||
66 | extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); | 68 | extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq)); |
67 | 69 | ||
68 | extern int FASTCALL(schedule_work(struct work_struct *work)); | 70 | extern int FASTCALL(schedule_work(struct work_struct *work)); |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 59f0b42bd89e..8fbef7008a7e 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -148,6 +148,27 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq, | |||
148 | return ret; | 148 | return ret; |
149 | } | 149 | } |
150 | 150 | ||
151 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | ||
152 | struct work_struct *work, unsigned long delay) | ||
153 | { | ||
154 | int ret = 0; | ||
155 | struct timer_list *timer = &work->timer; | ||
156 | |||
157 | if (!test_and_set_bit(0, &work->pending)) { | ||
158 | BUG_ON(timer_pending(timer)); | ||
159 | BUG_ON(!list_empty(&work->entry)); | ||
160 | |||
161 | /* This stores wq for the moment, for the timer_fn */ | ||
162 | work->wq_data = wq; | ||
163 | timer->expires = jiffies + delay; | ||
164 | timer->data = (unsigned long)work; | ||
165 | timer->function = delayed_work_timer_fn; | ||
166 | add_timer_on(timer, cpu); | ||
167 | ret = 1; | ||
168 | } | ||
169 | return ret; | ||
170 | } | ||
171 | |||
151 | static void run_workqueue(struct cpu_workqueue_struct *cwq) | 172 | static void run_workqueue(struct cpu_workqueue_struct *cwq) |
152 | { | 173 | { |
153 | unsigned long flags; | 174 | unsigned long flags; |
@@ -411,21 +432,7 @@ int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay | |||
411 | int schedule_delayed_work_on(int cpu, | 432 | int schedule_delayed_work_on(int cpu, |
412 | struct work_struct *work, unsigned long delay) | 433 | struct work_struct *work, unsigned long delay) |
413 | { | 434 | { |
414 | int ret = 0; | 435 | return queue_delayed_work_on(cpu, keventd_wq, work, delay); |
415 | struct timer_list *timer = &work->timer; | ||
416 | |||
417 | if (!test_and_set_bit(0, &work->pending)) { | ||
418 | BUG_ON(timer_pending(timer)); | ||
419 | BUG_ON(!list_empty(&work->entry)); | ||
420 | /* This stores keventd_wq for the moment, for the timer_fn */ | ||
421 | work->wq_data = keventd_wq; | ||
422 | timer->expires = jiffies + delay; | ||
423 | timer->data = (unsigned long)work; | ||
424 | timer->function = delayed_work_timer_fn; | ||
425 | add_timer_on(timer, cpu); | ||
426 | ret = 1; | ||
427 | } | ||
428 | return ret; | ||
429 | } | 436 | } |
430 | 437 | ||
431 | /** | 438 | /** |
@@ -622,6 +629,7 @@ void init_workqueues(void) | |||
622 | EXPORT_SYMBOL_GPL(__create_workqueue); | 629 | EXPORT_SYMBOL_GPL(__create_workqueue); |
623 | EXPORT_SYMBOL_GPL(queue_work); | 630 | EXPORT_SYMBOL_GPL(queue_work); |
624 | EXPORT_SYMBOL_GPL(queue_delayed_work); | 631 | EXPORT_SYMBOL_GPL(queue_delayed_work); |
632 | EXPORT_SYMBOL_GPL(queue_delayed_work_on); | ||
625 | EXPORT_SYMBOL_GPL(flush_workqueue); | 633 | EXPORT_SYMBOL_GPL(flush_workqueue); |
626 | EXPORT_SYMBOL_GPL(destroy_workqueue); | 634 | EXPORT_SYMBOL_GPL(destroy_workqueue); |
627 | 635 | ||