aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Manzanares <adam.manzanares@hgst.com>2016-10-17 14:27:28 -0400
committerTejun Heo <tj@kernel.org>2016-10-19 14:34:35 -0400
commit5dc8b362a2374d007bc0db649b7ab6a79dd32bda (patch)
tree0049fe83ff4a87fa490997eaffc0c79194001bb6
parent2facc6dacc64f14efc6fb81e2019f48e992166e2 (diff)
block: Add iocontext priority to request
Patch adds an association between iocontext ioprio and the ioprio of a request. This is done to enable request based drivers the ability to act on priority information stored in the request. An example being ATA devices that support command priorities. If the ATA driver discovers that the device supports command priorities and the request has valid priority information indicating the request is high priority, then a high priority command can be sent to the device. This should improve tail latencies for high priority IO on any device that queues requests internally and can make use of the priority information stored in the request. The ioprio of the request is set in blk_rq_set_prio which takes the request and the ioc as arguments. If the ioc is valid in blk_rq_set_prio then the iopriority of the request is set as the iopriority of the ioc. In init_request_from_bio a check is made to see if the ioprio of the bio is valid and if so then the request prio comes from the bio. Signed-off-by: Adam Manzananares <adam.manzanares@wdc.com> Reviewed-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--block/blk-core.c4
-rw-r--r--include/linux/blkdev.h14
2 files changed, 17 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 14d7c0740dc0..361b1b965d89 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1153,6 +1153,7 @@ static struct request *__get_request(struct request_list *rl, int op,
1153 1153
1154 blk_rq_init(q, rq); 1154 blk_rq_init(q, rq);
1155 blk_rq_set_rl(rq, rl); 1155 blk_rq_set_rl(rq, rl);
1156 blk_rq_set_prio(rq, ioc);
1156 req_set_op_attrs(rq, op, op_flags | REQ_ALLOCED); 1157 req_set_op_attrs(rq, op, op_flags | REQ_ALLOCED);
1157 1158
1158 /* init elvpriv */ 1159 /* init elvpriv */
@@ -1656,7 +1657,8 @@ void init_request_from_bio(struct request *req, struct bio *bio)
1656 1657
1657 req->errors = 0; 1658 req->errors = 0;
1658 req->__sector = bio->bi_iter.bi_sector; 1659 req->__sector = bio->bi_iter.bi_sector;
1659 req->ioprio = bio_prio(bio); 1660 if (ioprio_valid(bio_prio(bio)))
1661 req->ioprio = bio_prio(bio);
1660 blk_rq_bio_prep(req->q, req, bio); 1662 blk_rq_bio_prep(req->q, req, bio);
1661} 1663}
1662 1664
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index c47c358ba052..9a0ceaa1b7e6 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -934,6 +934,20 @@ static inline unsigned int blk_rq_count_bios(struct request *rq)
934} 934}
935 935
936/* 936/*
937 * blk_rq_set_prio - associate a request with prio from ioc
938 * @rq: request of interest
939 * @ioc: target iocontext
940 *
941 * Assocate request prio with ioc prio so request based drivers
942 * can leverage priority information.
943 */
944static inline void blk_rq_set_prio(struct request *rq, struct io_context *ioc)
945{
946 if (ioc)
947 rq->ioprio = ioc->ioprio;
948}
949
950/*
937 * Request issue related functions. 951 * Request issue related functions.
938 */ 952 */
939extern struct request *blk_peek_request(struct request_queue *q); 953extern struct request *blk_peek_request(struct request_queue *q);