summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2020-06-05 16:16:18 +0200
committerJens Axboe <axboe@kernel.dk>2021-01-27 09:16:00 -0700
commit7684fbde45169e6de15c180b1c084d2005e99961 (patch)
tree0cea99f26a94f6790e3e6c33cf7c1cab4ff291ec /block
parent28c6def009192b673f92ea357dfb535ba15e00a4 (diff)
downloadlinux-7684fbde45169e6de15c180b1c084d2005e99961.tar.gz
linux-7684fbde45169e6de15c180b1c084d2005e99961.tar.bz2
linux-7684fbde45169e6de15c180b1c084d2005e99961.zip
bfq: Use only idle IO periods for think time calculations
Currently whenever bfq queue has a request queued we add now - last_completion_time to the think time statistics. This is however misleading in case the process is able to submit several requests in parallel because e.g. if the queue has request completed at time T0 and then queues new requests at times T1, T2, then we will add T1-T0 and T2-T0 to think time statistics which just doesn't make any sence (the queue's think time is penalized by the queue being able to submit more IO). So add to think time statistics only time intervals when the queue had no IO pending. Signed-off-by: Jan Kara <jack@suse.cz> Acked-by: Paolo Valente <paolo.valente@linaro.org> [axboe: fix whitespace on empty line] Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/bfq-iosched.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index a0471ff97120..dfa87e360d71 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -5278,8 +5278,16 @@ static void bfq_update_io_thinktime(struct bfq_data *bfqd,
struct bfq_queue *bfqq)
{
struct bfq_ttime *ttime = &bfqq->ttime;
- u64 elapsed = ktime_get_ns() - bfqq->ttime.last_end_request;
+ u64 elapsed;
+ /*
+ * We are really interested in how long it takes for the queue to
+ * become busy when there is no outstanding IO for this queue. So
+ * ignore cases when the bfq queue has already IO queued.
+ */
+ if (bfqq->dispatched || bfq_bfqq_busy(bfqq))
+ return;
+ elapsed = ktime_get_ns() - bfqq->ttime.last_end_request;
elapsed = min_t(u64, elapsed, 2ULL * bfqd->bfq_slice_idle);
ttime->ttime_samples = (7*ttime->ttime_samples + 256) / 8;