ublk: store req in ublk_uring_cmd_pdu for ublk_cmd_tw_cb()
authorCaleb Sander Mateos <csander@purestorage.com>
Fri, 28 Mar 2025 18:04:11 +0000 (12:04 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 28 Mar 2025 22:15:43 +0000 (16:15 -0600)
Pass struct request *rq to ublk_cmd_tw_cb() through ublk_uring_cmd_pdu,
mirroring how it works for ublk_cmd_list_tw_cb(). This saves some
pointer dereferences, as well as the bounds check in blk_mq_tag_to_rq().

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Link: https://lore.kernel.org/r/20250328180411.2696494-6-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/ublk_drv.c

index 23250471562aca74f0c7102b56a73240889fa410..466a23b8937999c5e53cbe667c0ef096b5732a5e 100644 (file)
@@ -89,7 +89,10 @@ struct ublk_uring_cmd_pdu {
         * to avoid extra pre-allocation, and uring_cmd payload is always
         * free for us
         */
-       struct request *req_list;
+       union {
+               struct request *req;
+               struct request *req_list;
+       };
 
        /*
         * The following two are valid in this cmd whole lifetime, and
@@ -1268,18 +1271,17 @@ static void ublk_cmd_tw_cb(struct io_uring_cmd *cmd,
 {
        struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
        struct ublk_queue *ubq = pdu->ubq;
-       int tag = pdu->tag;
-       struct request *req = blk_mq_tag_to_rq(
-               ubq->dev->tag_set.tags[ubq->q_id], tag);
 
-       ublk_dispatch_req(ubq, req, issue_flags);
+       ublk_dispatch_req(ubq, pdu->req, issue_flags);
 }
 
 static void ublk_queue_cmd(struct ublk_queue *ubq, struct request *rq)
 {
-       struct ublk_io *io = &ubq->ios[rq->tag];
+       struct io_uring_cmd *cmd = ubq->ios[rq->tag].cmd;
+       struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
 
-       io_uring_cmd_complete_in_task(io->cmd, ublk_cmd_tw_cb);
+       pdu->req = rq;
+       io_uring_cmd_complete_in_task(cmd, ublk_cmd_tw_cb);
 }
 
 static void ublk_cmd_list_tw_cb(struct io_uring_cmd *cmd,