[CPUFREQ] Add queue_delayed_work_on() interface for workqueues.
Add queue_delayed_work_on() interface for workqueues. Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
ccb2fe209d
commit
7a6bc1cdd5
2 changed files with 25 additions and 15 deletions
|
@ -63,6 +63,8 @@ extern void destroy_workqueue(struct workqueue_struct *wq);
|
|||
|
||||
extern int FASTCALL(queue_work(struct workqueue_struct *wq, struct work_struct *work));
|
||||
extern int FASTCALL(queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay));
|
||||
extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
||||
struct work_struct *work, unsigned long delay);
|
||||
extern void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
|
||||
|
||||
extern int FASTCALL(schedule_work(struct work_struct *work));
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue