mirror of
https://github.com/torvalds/linux.git
synced 2024-12-31 23:31:29 +00:00
[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
@ -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_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 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 void FASTCALL(flush_workqueue(struct workqueue_struct *wq));
|
||||||
|
|
||||||
extern int FASTCALL(schedule_work(struct work_struct *work));
|
extern int FASTCALL(schedule_work(struct work_struct *work));
|
||||||
|
@ -148,6 +148,27 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq,
|
|||||||
return ret;
|
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)
|
static void run_workqueue(struct cpu_workqueue_struct *cwq)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
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,
|
int schedule_delayed_work_on(int cpu,
|
||||||
struct work_struct *work, unsigned long delay)
|
struct work_struct *work, unsigned long delay)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
return queue_delayed_work_on(cpu, keventd_wq, work, delay);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -622,6 +629,7 @@ void init_workqueues(void)
|
|||||||
EXPORT_SYMBOL_GPL(__create_workqueue);
|
EXPORT_SYMBOL_GPL(__create_workqueue);
|
||||||
EXPORT_SYMBOL_GPL(queue_work);
|
EXPORT_SYMBOL_GPL(queue_work);
|
||||||
EXPORT_SYMBOL_GPL(queue_delayed_work);
|
EXPORT_SYMBOL_GPL(queue_delayed_work);
|
||||||
|
EXPORT_SYMBOL_GPL(queue_delayed_work_on);
|
||||||
EXPORT_SYMBOL_GPL(flush_workqueue);
|
EXPORT_SYMBOL_GPL(flush_workqueue);
|
||||||
EXPORT_SYMBOL_GPL(destroy_workqueue);
|
EXPORT_SYMBOL_GPL(destroy_workqueue);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user