workqueue: mod_delayed_work_on() shouldn't queue timer on 0 delay
[pandora-kernel.git] / kernel / workqueue.c
index ac25db1..084aa47 100644 (file)
@@ -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);