mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 05:00:55 +07:00
block: prevent merging of requests with different priorities
Growing in size a high priority request by merging it with a lower priority BIO or request will increase the request execution time. This is the opposite result of the desired effect of high I/O priorities, namely getting low I/O latencies. Prevent merging of requests and BIOs that have different I/O priorities to fix this. Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
76dc891395
commit
668ffc0341
@ -662,7 +662,6 @@ bool bio_attempt_back_merge(struct request_queue *q, struct request *req,
|
|||||||
req->biotail->bi_next = bio;
|
req->biotail->bi_next = bio;
|
||||||
req->biotail = bio;
|
req->biotail = bio;
|
||||||
req->__data_len += bio->bi_iter.bi_size;
|
req->__data_len += bio->bi_iter.bi_size;
|
||||||
req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
|
|
||||||
|
|
||||||
blk_account_io_start(req, false);
|
blk_account_io_start(req, false);
|
||||||
return true;
|
return true;
|
||||||
@ -686,7 +685,6 @@ bool bio_attempt_front_merge(struct request_queue *q, struct request *req,
|
|||||||
|
|
||||||
req->__sector = bio->bi_iter.bi_sector;
|
req->__sector = bio->bi_iter.bi_sector;
|
||||||
req->__data_len += bio->bi_iter.bi_size;
|
req->__data_len += bio->bi_iter.bi_size;
|
||||||
req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
|
|
||||||
|
|
||||||
blk_account_io_start(req, false);
|
blk_account_io_start(req, false);
|
||||||
return true;
|
return true;
|
||||||
@ -706,7 +704,6 @@ bool bio_attempt_discard_merge(struct request_queue *q, struct request *req,
|
|||||||
req->biotail->bi_next = bio;
|
req->biotail->bi_next = bio;
|
||||||
req->biotail = bio;
|
req->biotail = bio;
|
||||||
req->__data_len += bio->bi_iter.bi_size;
|
req->__data_len += bio->bi_iter.bi_size;
|
||||||
req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
|
|
||||||
req->nr_phys_segments = segments + 1;
|
req->nr_phys_segments = segments + 1;
|
||||||
|
|
||||||
blk_account_io_start(req, false);
|
blk_account_io_start(req, false);
|
||||||
|
@ -752,6 +752,9 @@ static struct request *attempt_merge(struct request_queue *q,
|
|||||||
if (req->write_hint != next->write_hint)
|
if (req->write_hint != next->write_hint)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (req->ioprio != next->ioprio)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are allowed to merge, then append bio list
|
* If we are allowed to merge, then append bio list
|
||||||
* from next to rq and release next. merge_requests_fn
|
* from next to rq and release next. merge_requests_fn
|
||||||
@ -807,8 +810,6 @@ static struct request *attempt_merge(struct request_queue *q,
|
|||||||
*/
|
*/
|
||||||
blk_account_io_merge(next);
|
blk_account_io_merge(next);
|
||||||
|
|
||||||
req->ioprio = ioprio_best(req->ioprio, next->ioprio);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ownership of bio passed from next to req, return 'next' for
|
* ownership of bio passed from next to req, return 'next' for
|
||||||
* the caller to free
|
* the caller to free
|
||||||
@ -883,6 +884,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
|
|||||||
if (rq->write_hint != bio->bi_write_hint)
|
if (rq->write_hint != bio->bi_write_hint)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (rq->ioprio != bio_prio(bio))
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user