aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin TerAvest <teravest@google.com>2011-03-23 03:25:44 -0400
committerJens Axboe <jaxboe@fusionio.com>2011-03-23 03:25:44 -0400
commit62a37f6badd1ac97ba07d543b5d4be2f9cb17217 (patch)
treeb659ac7b4c9fce787694bb8a33affa229d1cd552
parent04521db04e9a11e74b0252d222051cb194487f4d (diff)
cfq-iosched: Don't clear queue stats when preempt.
For v2, I added back lines to cfq_preempt_queue() that were removed during updates for accounting unaccounted_time. Thanks for pointing out that I'd missed these, Vivek. Previous commit "cfq-iosched: Don't set active queue in preempt" wrongly cleared stats for preempting queues when it shouldn't have, because when we choose a queue to preempt, it still isn't necessarily scheduled next. Thanks to Vivek Goyal for figuring this out and understanding how the preemption code works. Signed-off-by: Justin TerAvest <teravest@google.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
-rw-r--r--block/cfq-iosched.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 69208d732903..fea1b5a9b7e9 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -1620,33 +1620,27 @@ static inline void cfq_del_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1620 cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg); 1620 cfq_blkiocg_update_idle_time_stats(&cfqq->cfqg->blkg);
1621} 1621}
1622 1622
1623static void cfq_clear_queue_stats(struct cfq_data *cfqd,
1624 struct cfq_queue *cfqq)
1625{
1626 cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
1627 cfqq->slice_start = 0;
1628 cfqq->dispatch_start = jiffies;
1629 cfqq->allocated_slice = 0;
1630 cfqq->slice_end = 0;
1631 cfqq->slice_dispatch = 0;
1632 cfqq->nr_sectors = 0;
1633
1634 cfq_clear_cfqq_wait_request(cfqq);
1635 cfq_clear_cfqq_must_dispatch(cfqq);
1636 cfq_clear_cfqq_must_alloc_slice(cfqq);
1637 cfq_clear_cfqq_fifo_expire(cfqq);
1638 cfq_mark_cfqq_slice_new(cfqq);
1639
1640 cfq_del_timer(cfqd, cfqq);
1641}
1642
1643static void __cfq_set_active_queue(struct cfq_data *cfqd, 1623static void __cfq_set_active_queue(struct cfq_data *cfqd,
1644 struct cfq_queue *cfqq) 1624 struct cfq_queue *cfqq)
1645{ 1625{
1646 if (cfqq) { 1626 if (cfqq) {
1647 cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", 1627 cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
1648 cfqd->serving_prio, cfqd->serving_type); 1628 cfqd->serving_prio, cfqd->serving_type);
1649 cfq_clear_queue_stats(cfqd, cfqq); 1629 cfq_blkiocg_update_avg_queue_size_stats(&cfqq->cfqg->blkg);
1630 cfqq->slice_start = 0;
1631 cfqq->dispatch_start = jiffies;
1632 cfqq->allocated_slice = 0;
1633 cfqq->slice_end = 0;
1634 cfqq->slice_dispatch = 0;
1635 cfqq->nr_sectors = 0;
1636
1637 cfq_clear_cfqq_wait_request(cfqq);
1638 cfq_clear_cfqq_must_dispatch(cfqq);
1639 cfq_clear_cfqq_must_alloc_slice(cfqq);
1640 cfq_clear_cfqq_fifo_expire(cfqq);
1641 cfq_mark_cfqq_slice_new(cfqq);
1642
1643 cfq_del_timer(cfqd, cfqq);
1650 } 1644 }
1651 1645
1652 cfqd->active_queue = cfqq; 1646 cfqd->active_queue = cfqq;
@@ -3339,7 +3333,8 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
3339 3333
3340 cfq_service_tree_add(cfqd, cfqq, 1); 3334 cfq_service_tree_add(cfqd, cfqq, 1);
3341 3335
3342 cfq_clear_queue_stats(cfqd, cfqq); 3336 cfqq->slice_end = 0;
3337 cfq_mark_cfqq_slice_new(cfqq);
3343} 3338}
3344 3339
3345/* 3340/*