Messages in this thread Patch in this message |  | | | From | Divyesh Shah <> | | Subject | [PATCH] block: Improve think time sampling for CFQ | | Date | Thu, 16 Jul 2009 02:56:54 +0530 |
| |
Avoid taking a think time sample when the cfqq is not a sync queue or not currently active or till its first request in the ongoing timeslice completes.
Signed-off by: Divyesh Shah <dpshah@google.com> --- This applies to Linus's kernel tree. block/cfq-iosched.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index fd7080e..1657d4f 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -1904,10 +1904,17 @@ err: } static void -cfq_update_io_thinktime(struct cfq_data *cfqd, struct cfq_io_context *cic) +cfq_update_io_thinktime(struct cfq_data *cfqd, struct cfq_queue *cfqq, + struct cfq_io_context *cic) { - unsigned long elapsed = jiffies - cic->last_end_request; - unsigned long ttime = min(elapsed, 2UL * cfqd->cfq_slice_idle); + unsigned long elapsed, ttime; + + if (!cfq_cfqq_sync(cfqq) || cfqq != cfqd->active_queue || + cfq_cfqq_slice_new(cfqq)) + return; + + elapsed = jiffies - cic->last_end_request; + ttime = min(elapsed, 2UL * cfqd->cfq_slice_idle); cic->ttime_samples = (7*cic->ttime_samples + 256) / 8; cic->ttime_total = (7*cic->ttime_total + 256*ttime) / 8; @@ -2072,7 +2079,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq, if (rq_is_meta(rq)) cfqq->meta_pending++; - cfq_update_io_thinktime(cfqd, cic); + cfq_update_io_thinktime(cfqd, cfqq, cic); cfq_update_io_seektime(cfqd, cic, rq); cfq_update_idle_window(cfqd, cfqq, cic);
|  |