Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Adam Manzanares and committed by
Tejun Heo
5dc8b362 2facc6da

+17 -1
+3 -1
block/blk-core.c
··· 1153 1153 1154 1154 blk_rq_init(q, rq); 1155 1155 blk_rq_set_rl(rq, rl); 1156 + blk_rq_set_prio(rq, ioc); 1156 1157 req_set_op_attrs(rq, op, op_flags | REQ_ALLOCED); 1157 1158 1158 1159 /* init elvpriv */ ··· 1657 1656 1658 1657 req->errors = 0; 1659 1658 req->__sector = bio->bi_iter.bi_sector; 1660 - req->ioprio = bio_prio(bio); 1659 + if (ioprio_valid(bio_prio(bio))) 1660 + req->ioprio = bio_prio(bio); 1661 1661 blk_rq_bio_prep(req->q, req, bio); 1662 1662 } 1663 1663
+14
include/linux/blkdev.h
··· 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 + */ 944 + static 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 951 * Request issue related functions. 938 952 */ 939 953 extern struct request *blk_peek_request(struct request_queue *q);