Commit 7074f076 authored by Paolo Valente's avatar Paolo Valente Committed by Jens Axboe

block, bfq: do not tag totally seeky queues as soft rt

Sync random I/O is likely to be confused with soft real-time I/O,
because it is characterized by limited throughput and apparently
isochronous arrival pattern. To avoid false positives, this commits
prevents bfq_queues containing only random (seeky) I/O from being
tagged as soft real-time.
Tested-by: default avatarHolger Hoffstätte <holger@applied-asynchrony.com>
Tested-by: default avatarOleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: default avatarPaolo Valente <paolo.valente@linaro.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8cacc5ab
...@@ -242,6 +242,14 @@ static struct kmem_cache *bfq_pool; ...@@ -242,6 +242,14 @@ static struct kmem_cache *bfq_pool;
blk_rq_sectors(rq) < BFQQ_SECT_THR_NONROT)) blk_rq_sectors(rq) < BFQQ_SECT_THR_NONROT))
#define BFQQ_CLOSE_THR (sector_t)(8 * 1024) #define BFQQ_CLOSE_THR (sector_t)(8 * 1024)
#define BFQQ_SEEKY(bfqq) (hweight32(bfqq->seek_history) > 19) #define BFQQ_SEEKY(bfqq) (hweight32(bfqq->seek_history) > 19)
/*
* Sync random I/O is likely to be confused with soft real-time I/O,
* because it is characterized by limited throughput and apparently
* isochronous arrival pattern. To avoid false positives, queues
* containing only random (seeky) I/O are prevented from being tagged
* as soft real-time.
*/
#define BFQQ_TOTALLY_SEEKY(bfqq) (bfqq->seek_history & -1)
/* Min number of samples required to perform peak-rate update */ /* Min number of samples required to perform peak-rate update */
#define BFQ_RATE_MIN_SAMPLES 32 #define BFQ_RATE_MIN_SAMPLES 32
...@@ -1622,6 +1630,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, ...@@ -1622,6 +1630,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
*/ */
in_burst = bfq_bfqq_in_large_burst(bfqq); in_burst = bfq_bfqq_in_large_burst(bfqq);
soft_rt = bfqd->bfq_wr_max_softrt_rate > 0 && soft_rt = bfqd->bfq_wr_max_softrt_rate > 0 &&
!BFQQ_TOTALLY_SEEKY(bfqq) &&
!in_burst && !in_burst &&
time_is_before_jiffies(bfqq->soft_rt_next_start) && time_is_before_jiffies(bfqq->soft_rt_next_start) &&
bfqq->dispatched == 0; bfqq->dispatched == 0;
...@@ -4816,6 +4825,11 @@ bfq_update_io_seektime(struct bfq_data *bfqd, struct bfq_queue *bfqq, ...@@ -4816,6 +4825,11 @@ bfq_update_io_seektime(struct bfq_data *bfqd, struct bfq_queue *bfqq,
{ {
bfqq->seek_history <<= 1; bfqq->seek_history <<= 1;
bfqq->seek_history |= BFQ_RQ_SEEKY(bfqd, bfqq->last_request_pos, rq); bfqq->seek_history |= BFQ_RQ_SEEKY(bfqd, bfqq->last_request_pos, rq);
if (bfqq->wr_coeff > 1 &&
bfqq->wr_cur_max_time == bfqd->bfq_wr_rt_max_time &&
BFQQ_TOTALLY_SEEKY(bfqq))
bfq_bfqq_end_wr(bfqq);
} }
static void bfq_update_has_short_ttime(struct bfq_data *bfqd, static void bfq_update_has_short_ttime(struct bfq_data *bfqd,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment