[PATCH] cfq-iosched: fix bug in timer handling for the idle class
authorJens Axboe <axboe@suse.de>
Thu, 1 Jun 2006 08:13:43 +0000 (10:13 +0200)
committerJens Axboe <axboe@suse.de>
Thu, 1 Jun 2006 08:13:43 +0000 (10:13 +0200)
There's a small window from when the timer is entered and we grab
the queue lock, where cfq_set_active_queue() could be rearming the
timer for us. Seen in the wild on a 12-way ppc box. Fix this by
just using mod_timer(), which will do the right thing for us.

Signed-off-by: Jens Axboe <axboe@suse.de>
block/cfq-iosched.c

index 5d2047b93eb5373294fe5d344703a34a1e8debc8..85d188a30f8219d95e79fff7aa2d13d8b62efc4c 100644 (file)
@@ -2193,10 +2193,9 @@ static void cfq_idle_class_timer(unsigned long data)
         * race with a non-idle queue, reset timer
         */
        end = cfqd->last_end_request + CFQ_IDLE_GRACE;
-       if (!time_after_eq(jiffies, end)) {
-               cfqd->idle_class_timer.expires = end;
-               add_timer(&cfqd->idle_class_timer);
-       } else
+       if (!time_after_eq(jiffies, end))
+               mod_timer(&cfqd->idle_class_timer, end);
+       else
                cfq_schedule_dispatch(cfqd);
 
        spin_unlock_irqrestore(cfqd->queue->queue_lock, flags);