cfq-iosched: Don't set active queue in preempt
authorJustin TerAvest <teravest@google.com>
Tue, 22 Mar 2011 20:26:49 +0000 (21:26 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Tue, 22 Mar 2011 20:26:49 +0000 (21:26 +0100)
Commit "Add unaccounted time to timeslice_used" changed the behavior of
cfq_preempt_queue to set cfqq active. Vivek pointed out that other
preemption rules might get involved, so we shouldn't manually set which
queue is active.

This cleans up the code to just clear the queue stats at preemption
time.

Signed-off-by: Justin TerAvest <teravest@google.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
block/cfq-iosched.c

index 12e380b2c4e474ebb75454f2ea8e6144db6a0de2..69208d73290340f17c6ff13ba426d7660d78bda6 100644 (file)
@@ -1620,27 +1620,33 @@ static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
        cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg);
 }
 
+static void cfq_clear_queue_stats(struct cfq_data *cfqd,
+                                 struct cfq_queue *cfqq)
+{
+       cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
+       cfqq->slice_start = 0;
+       cfqq->dispatch_start = jiffies;
+       cfqq->allocated_slice = 0;
+       cfqq->slice_end = 0;
+       cfqq->slice_dispatch = 0;
+       cfqq->nr_sectors = 0;
+
+       cfq_clear_cfqq_wait_request(cfqq);
+       cfq_clear_cfqq_must_dispatch(cfqq);
+       cfq_clear_cfqq_must_alloc_slice(cfqq);
+       cfq_clear_cfqq_fifo_expire(cfqq);
+       cfq_mark_cfqq_slice_new(cfqq);
+
+       cfq_del_timer(cfqd, cfqq);
+}
+
 static void __cfq_set_active_queue(struct cfq_data *cfqd,
                                   struct cfq_queue *cfqq)
 {
        if (cfqq) {
                cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
                                cfqd->serving_prio, cfqd->serving_type);
-               cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
-               cfqq->slice_start = 0;
-               cfqq->dispatch_start = jiffies;
-               cfqq->allocated_slice = 0;
-               cfqq->slice_end = 0;
-               cfqq->slice_dispatch = 0;
-               cfqq->nr_sectors = 0;
-
-               cfq_clear_cfqq_wait_request(cfqq);
-               cfq_clear_cfqq_must_dispatch(cfqq);
-               cfq_clear_cfqq_must_alloc_slice(cfqq);
-               cfq_clear_cfqq_fifo_expire(cfqq);
-               cfq_mark_cfqq_slice_new(cfqq);
-
-               cfq_del_timer(cfqd, cfqq);
+               cfq_clear_queue_stats(cfqd, cfqq);
        }
 
        cfqd->active_queue = cfqq;
@@ -3332,7 +3338,8 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
        BUG_ON(!cfq_cfqq_on_rr(cfqq));
 
        cfq_service_tree_add(cfqd, cfqq, 1);
-       __cfq_set_active_queue(cfqd, cfqq);
+
+       cfq_clear_queue_stats(cfqd, cfqq);
 }
 
 /*