diff options
| author | Paolo Valente <paolo.valente@linaro.org> | 2019-03-12 09:59:31 +0100 | 
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2019-04-01 08:15:40 -0600 | 
| commit | 7074f076ff153021f408229b0ce63063dde9a400 (patch) | |
| tree | 692007553290b883af2a141ca72890621089fbf8 /block | |
| parent | 8cacc5ab3eacf5284bc9b0d7d5b85b748a338104 (diff) | |
| download | linux-7074f076ff153021f408229b0ce63063dde9a400.tar.bz2 | |
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: Holger Hoffstätte <holger@applied-asynchrony.com>
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
| -rw-r--r-- | block/bfq-iosched.c | 14 | 
1 files changed, 14 insertions, 0 deletions
| diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index b957e9db87d8..7044da0b1c52 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -242,6 +242,14 @@ static struct kmem_cache *bfq_pool;  	  blk_rq_sectors(rq) < BFQQ_SECT_THR_NONROT))  #define BFQQ_CLOSE_THR		(sector_t)(8 * 1024)  #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 */  #define BFQ_RATE_MIN_SAMPLES	32 @@ -1622,6 +1630,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,  	 */  	in_burst = bfq_bfqq_in_large_burst(bfqq);  	soft_rt = bfqd->bfq_wr_max_softrt_rate > 0 && +		!BFQQ_TOTALLY_SEEKY(bfqq) &&  		!in_burst &&  		time_is_before_jiffies(bfqq->soft_rt_next_start) &&  		bfqq->dispatched == 0; @@ -4816,6 +4825,11 @@ bfq_update_io_seektime(struct bfq_data *bfqd, struct bfq_queue *bfqq,  {  	bfqq->seek_history <<= 1;  	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, |