cfq-iosched: Don't clear queue stats when preempt.
PATCH v2 1/1 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.
--- block/cfq-iosched.c | 39 +++++++++++++++++---------------------- 1 files changed, 17 insertions(+), 22 deletions(-)
block/cfq-iosched.c +17 -22
@@ -1620,33 +1620,27 @@ 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_clear_queue_stats (cfqd, 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); } cfqd->active_queue = cfqq;
@@ -3339,7 +3333,8 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)cfq_service_tree_add (cfqd, cfqq,1 ); -cfq_clear_queue_stats (cfqd, cfqq); + cfqq->slice_end =0 ; +cfq_mark_cfqq_slice_new (cfqq); }/*
Signature · 1 line
1.7.3.1
Quoted 10 lines · Justin TerAvest
For v2, I added back lines to
cfq_preempt_queue()that were removed during updates for accountingunaccounted_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.
Thanks to both of you, applied.
Signature · 1 line
Jens Axboe