|
@@ -148,6 +148,27 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
|
|
+ struct work_struct *work, unsigned long delay)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ struct timer_list *timer = &work->timer;
|
|
|
+
|
|
|
+ if (!test_and_set_bit(0, &work->pending)) {
|
|
|
+ BUG_ON(timer_pending(timer));
|
|
|
+ BUG_ON(!list_empty(&work->entry));
|
|
|
+
|
|
|
+ /* This stores wq for the moment, for the timer_fn */
|
|
|
+ work->wq_data = wq;
|
|
|
+ timer->expires = jiffies + delay;
|
|
|
+ timer->data = (unsigned long)work;
|
|
|
+ timer->function = delayed_work_timer_fn;
|
|
|
+ add_timer_on(timer, cpu);
|
|
|
+ ret = 1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static void run_workqueue(struct cpu_workqueue_struct *cwq)
|
|
|
{
|
|
|
unsigned long flags;
|
|
@@ -411,21 +432,7 @@ int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay
|
|
|
int schedule_delayed_work_on(int cpu,
|
|
|
struct work_struct *work, unsigned long delay)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
- struct timer_list *timer = &work->timer;
|
|
|
-
|
|
|
- if (!test_and_set_bit(0, &work->pending)) {
|
|
|
- BUG_ON(timer_pending(timer));
|
|
|
- BUG_ON(!list_empty(&work->entry));
|
|
|
- /* This stores keventd_wq for the moment, for the timer_fn */
|
|
|
- work->wq_data = keventd_wq;
|
|
|
- timer->expires = jiffies + delay;
|
|
|
- timer->data = (unsigned long)work;
|
|
|
- timer->function = delayed_work_timer_fn;
|
|
|
- add_timer_on(timer, cpu);
|
|
|
- ret = 1;
|
|
|
- }
|
|
|
- return ret;
|
|
|
+ return queue_delayed_work_on(cpu, keventd_wq, work, delay);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -622,6 +629,7 @@ void init_workqueues(void)
|
|
|
EXPORT_SYMBOL_GPL(__create_workqueue);
|
|
|
EXPORT_SYMBOL_GPL(queue_work);
|
|
|
EXPORT_SYMBOL_GPL(queue_delayed_work);
|
|
|
+EXPORT_SYMBOL_GPL(queue_delayed_work_on);
|
|
|
EXPORT_SYMBOL_GPL(flush_workqueue);
|
|
|
EXPORT_SYMBOL_GPL(destroy_workqueue);
|
|
|
|