Commit 715f1300 authored by Tejun Heo's avatar Tejun Heo

workqueue: fix zero @delay handling of queue_delayed_work_on()

If @delay is zero and the dealyed_work is idle, queue_delayed_work()
queues it for immediate execution; however, queue_delayed_work_on()
lacks this logic and always goes through timer regardless of @delay.

This patch moves 0 @delay handling logic from queue_delayed_work() to
queue_delayed_work_on() so that both functions behave the same.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 57469821
...@@ -1125,7 +1125,9 @@ EXPORT_SYMBOL_GPL(delayed_work_timer_fn); ...@@ -1125,7 +1125,9 @@ EXPORT_SYMBOL_GPL(delayed_work_timer_fn);
* @dwork: work to queue * @dwork: work to queue
* @delay: number of jiffies to wait before queueing * @delay: number of jiffies to wait before queueing
* *
* Returns %false if @work was already on a queue, %true otherwise. * Returns %false if @work was already on a queue, %true otherwise. If
* @delay is zero and @dwork is idle, it will be scheduled for immediate
* execution.
*/ */
bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
struct delayed_work *dwork, unsigned long delay) struct delayed_work *dwork, unsigned long delay)
...@@ -1135,6 +1137,9 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, ...@@ -1135,6 +1137,9 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
bool ret = false; bool ret = false;
unsigned long flags; unsigned long flags;
if (!delay)
return queue_work_on(cpu, wq, &dwork->work);
/* read the comment in __queue_work() */ /* read the comment in __queue_work() */
local_irq_save(flags); local_irq_save(flags);
...@@ -1185,14 +1190,11 @@ EXPORT_SYMBOL_GPL(queue_delayed_work_on); ...@@ -1185,14 +1190,11 @@ EXPORT_SYMBOL_GPL(queue_delayed_work_on);
* @dwork: delayable work to queue * @dwork: delayable work to queue
* @delay: number of jiffies to wait before queueing * @delay: number of jiffies to wait before queueing
* *
* Returns %false if @work was already on a queue, %true otherwise. * Equivalent to queue_delayed_work_on() but tries to use the local CPU.
*/ */
bool queue_delayed_work(struct workqueue_struct *wq, bool queue_delayed_work(struct workqueue_struct *wq,
struct delayed_work *dwork, unsigned long delay) struct delayed_work *dwork, unsigned long delay)
{ {
if (delay == 0)
return queue_work(wq, &dwork->work);
return queue_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay); return queue_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay);
} }
EXPORT_SYMBOL_GPL(queue_delayed_work); EXPORT_SYMBOL_GPL(queue_delayed_work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment