|
@@ -1364,6 +1364,17 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq,
|
|
|
BUG_ON(timer_pending(timer));
|
|
|
BUG_ON(!list_empty(&work->entry));
|
|
|
|
|
|
+ /*
|
|
|
+ * If @delay is 0, queue @dwork->work immediately. This is for
|
|
|
+ * both optimization and correctness. The earliest @timer can
|
|
|
+ * expire is on the closest next tick and delayed_work users depend
|
|
|
+ * on that there's no such delay when @delay is 0.
|
|
|
+ */
|
|
|
+ if (!delay) {
|
|
|
+ __queue_work(cpu, wq, &dwork->work);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
timer_stats_timer_set_start_info(&dwork->timer);
|
|
|
|
|
|
/*
|
|
@@ -1417,9 +1428,6 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
|
|
bool ret = false;
|
|
|
unsigned long flags;
|
|
|
|
|
|
- if (!delay)
|
|
|
- return queue_work_on(cpu, wq, &dwork->work);
|
|
|
-
|
|
|
/* read the comment in __queue_work() */
|
|
|
local_irq_save(flags);
|
|
|
|