From: Damien Le Moal damien.lemoal@wdc.com
mainline inclusion from mainline-5.0-rc1 commit 668ffc03418bc779f699797c72ecf968cd6525a9 category: feature bugzilla: https://bugzilla.openeuler.org/show_bug.cgi?id=27 CVE: NA ---------------------------
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
Conflicts: block/blk-merge.c [ Patch 9cf2bab630("block: kill request ->cpu member") is not applied. ]
Signed-off-by: Zhihao Cheng chengzhihao1@huawei.com Signed-off-by: yangerkun yangerkun@huawei.com Reviewed-by: zhangyi (F) yi.zhang@huawei.com Signed-off-by: Cheng Jian cj.chengjian@huawei.com --- block/blk-core.c | 3 --- block/blk-merge.c | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c index 3a9944ddee3a..a3213e527008 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1814,7 +1814,6 @@ bool bio_attempt_back_merge(struct request_queue *q, struct request *req, req->biotail->bi_next = bio; req->biotail = bio; req->__data_len += bio->bi_iter.bi_size; - req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
blk_account_io_start(req, false); return true; @@ -1838,7 +1837,6 @@ bool bio_attempt_front_merge(struct request_queue *q, struct request *req,
req->__sector = bio->bi_iter.bi_sector; req->__data_len += bio->bi_iter.bi_size; - req->ioprio = ioprio_best(req->ioprio, bio_prio(bio));
blk_account_io_start(req, false); return true; @@ -1858,7 +1856,6 @@ bool bio_attempt_discard_merge(struct request_queue *q, struct request *req, req->biotail->bi_next = bio; req->biotail = bio; req->__data_len += bio->bi_iter.bi_size; - req->ioprio = ioprio_best(req->ioprio, bio_prio(bio)); req->nr_phys_segments = segments + 1;
blk_account_io_start(req, false); diff --git a/block/blk-merge.c b/block/blk-merge.c index d24a6c9398ed..7904e45fc5c6 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -727,6 +727,9 @@ static struct request *attempt_merge(struct request_queue *q, if (req->write_hint != next->write_hint) return NULL;
+ if (req->ioprio != next->ioprio) + return NULL; + /* * If we are allowed to merge, then append bio list * from next to rq and release next. merge_requests_fn @@ -782,7 +785,6 @@ static struct request *attempt_merge(struct request_queue *q, */ blk_account_io_merge(next);
- req->ioprio = ioprio_best(req->ioprio, next->ioprio); if (blk_rq_cpu_valid(next)) req->cpu = next->cpu;
@@ -865,6 +867,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (rq->write_hint != bio->bi_write_hint) return false;
+ if (rq->ioprio != bio_prio(bio)) + return false; + return true; }