From: Ming Lei Date: Sun, 13 Jul 2025 14:34:02 +0000 (+0800) Subject: ublk: store auto buffer register data into `struct ublk_io` X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21bb9facb1e78c50cf8bd5a51571fb8cbec3fb9d;p=thirdparty%2Fkernel%2Flinux.git ublk: store auto buffer register data into `struct ublk_io` We can share space of `io->addr` for storing auto buffer register data and user space buffer address. So store auto buffer register data into `struct ublk_io`. Prepare for supporting batch IO in which many ublk IOs share single uring_cmd, so we can't store auto buffer register data into uring_cmd pdu. Reviewed-by: Caleb Sander Mateos Signed-off-by: Ming Lei Link: https://lore.kernel.org/r/20250713143415.2857561-8-ming.lei@redhat.com Signed-off-by: Jens Axboe --- diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index f70fab36fbc78..c69d4fafc6ccb 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -105,8 +105,6 @@ struct ublk_uring_cmd_pdu { */ struct ublk_queue *ubq; - struct ublk_auto_buf_reg buf; - u16 tag; }; @@ -159,7 +157,10 @@ struct ublk_uring_cmd_pdu { struct ublk_io { /* userspace buffer address from io cmd */ - __u64 addr; + union { + __u64 addr; + struct ublk_auto_buf_reg buf; + }; unsigned int flags; int res; @@ -187,8 +188,6 @@ struct ublk_io { /* Count of buffers registered on task and not yet unregistered */ unsigned task_registered_buffers; - /* auto-registered buffer, valid if UBLK_IO_FLAG_AUTO_BUF_REG is set */ - u16 buf_index; void *buf_ctx_handle; } ____cacheline_aligned_in_smp; @@ -1217,13 +1216,12 @@ ublk_auto_buf_reg_fallback(const struct ublk_queue *ubq, struct ublk_io *io) static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req, struct ublk_io *io, unsigned int issue_flags) { - struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(io->cmd); int ret; ret = io_buffer_register_bvec(io->cmd, req, ublk_io_release, - pdu->buf.index, issue_flags); + io->buf.index, issue_flags); if (ret) { - if (pdu->buf.flags & UBLK_AUTO_BUF_REG_FALLBACK) { + if (io->buf.flags & UBLK_AUTO_BUF_REG_FALLBACK) { ublk_auto_buf_reg_fallback(ubq, io); return true; } @@ -1233,8 +1231,6 @@ static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req, io->task_registered_buffers = 1; io->buf_ctx_handle = io_uring_cmd_ctx_handle(io->cmd); - /* store buffer index in request payload */ - io->buf_index = pdu->buf.index; io->flags |= UBLK_IO_FLAG_AUTO_BUF_REG; return true; } @@ -2011,16 +2007,14 @@ static inline int ublk_check_cmd_op(u32 cmd_op) return 0; } -static inline int ublk_set_auto_buf_reg(struct io_uring_cmd *cmd) +static inline int ublk_set_auto_buf_reg(struct ublk_io *io, struct io_uring_cmd *cmd) { - struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd); - - pdu->buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr)); + io->buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr)); - if (pdu->buf.reserved0 || pdu->buf.reserved1) + if (io->buf.reserved0 || io->buf.reserved1) return -EINVAL; - if (pdu->buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK) + if (io->buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK) return -EINVAL; return 0; } @@ -2043,10 +2037,10 @@ static int ublk_handle_auto_buf_reg(struct ublk_io *io, * this ublk request gets stuck. */ if (io->buf_ctx_handle == io_uring_cmd_ctx_handle(cmd)) - *buf_idx = io->buf_index; + *buf_idx = io->buf.index; } - return ublk_set_auto_buf_reg(cmd); + return ublk_set_auto_buf_reg(io, cmd); } /* Once we return, `io->req` can't be used any more */