aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDivyesh Shah <dpshah@google.com>2010-04-09 03:29:57 -0400
committerJens Axboe <jens.axboe@oracle.com>2010-04-09 03:29:57 -0400
commit3440c49f5c5ecb4f29b0544aa87da71888404f8f (patch)
tree62afdbc8eb90393e768d0770c20fc9b2c7e8e042
parent02246c41171097ceab3246f6dc251ac89de6004b (diff)
cfq-iosched: Fix the incorrect timeslice accounting with forced_dispatch
When CFQ dispatches requests forcefully due to a barrier or changing iosched, it runs through all cfqq's dispatching requests and then expires each queue. However, it does not activate a cfqq before flushing its IOs resulting in using stale values for computing slice_used. This patch fixes it by calling activate queue before flushing reuqests from each queue. This is useful mostly for barrier requests because when the iosched is changing it really doesnt matter if we have incorrect accounting since we're going to break down all structures anyway. We also now expire the current timeslice before moving on with the dispatch to accurately account slice used for that cfqq. Signed-off-by: Divyesh Shah<dpshah@google.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--block/cfq-iosched.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 7104ac816fb6..b773000f8a06 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -2205,10 +2205,13 @@ static int cfq_forced_dispatch(struct cfq_data *cfqd)
2205 struct cfq_queue *cfqq; 2205 struct cfq_queue *cfqq;
2206 int dispatched = 0; 2206 int dispatched = 0;
2207 2207
2208 while ((cfqq = cfq_get_next_queue_forced(cfqd)) != NULL) 2208 /* Expire the timeslice of the current active queue first */
2209 cfq_slice_expired(cfqd, 0);
2210 while ((cfqq = cfq_get_next_queue_forced(cfqd)) != NULL) {
2211 __cfq_set_active_queue(cfqd, cfqq);
2209 dispatched += __cfq_forced_dispatch_cfqq(cfqq); 2212 dispatched += __cfq_forced_dispatch_cfqq(cfqq);
2213 }
2210 2214
2211 cfq_slice_expired(cfqd, 0);
2212 BUG_ON(cfqd->busy_queues); 2215 BUG_ON(cfqd->busy_queues);
2213 2216
2214 cfq_log(cfqd, "forced_dispatch=%d", dispatched); 2217 cfq_log(cfqd, "forced_dispatch=%d", dispatched);