Skip to content

Commit 37e1c9a

Browse files
Ming Leikawasaki
authored andcommitted
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. Signed-off-by: Ming Lei <[email protected]>
1 parent 9f6481c commit 37e1c9a

1 file changed

Lines changed: 12 additions & 18 deletions

File tree

drivers/block/ublk_drv.c

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ struct ublk_uring_cmd_pdu {
105105
*/
106106
struct ublk_queue *ubq;
107107

108-
struct ublk_auto_buf_reg buf;
109-
110108
u16 tag;
111109
};
112110

@@ -159,7 +157,10 @@ struct ublk_uring_cmd_pdu {
159157

160158
struct ublk_io {
161159
/* userspace buffer address from io cmd */
162-
__u64 addr;
160+
union {
161+
__u64 addr;
162+
struct ublk_auto_buf_reg buf;
163+
};
163164
unsigned int flags;
164165
int res;
165166

@@ -187,8 +188,6 @@ struct ublk_io {
187188
/* Count of buffers registered on task and not yet unregistered */
188189
unsigned task_registered_buffers;
189190

190-
/* auto-registered buffer, valid if UBLK_IO_FLAG_AUTO_BUF_REG is set */
191-
u16 buf_index;
192191
void *buf_ctx_handle;
193192
} ____cacheline_aligned_in_smp;
194193

@@ -1216,13 +1215,12 @@ ublk_auto_buf_reg_fallback(const struct ublk_queue *ubq, struct ublk_io *io)
12161215
static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req,
12171216
struct ublk_io *io, unsigned int issue_flags)
12181217
{
1219-
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(io->cmd);
12201218
int ret;
12211219

12221220
ret = io_buffer_register_bvec(io->cmd, req, ublk_io_release,
1223-
pdu->buf.index, issue_flags);
1221+
io->buf.index, issue_flags);
12241222
if (ret) {
1225-
if (pdu->buf.flags & UBLK_AUTO_BUF_REG_FALLBACK) {
1223+
if (io->buf.flags & UBLK_AUTO_BUF_REG_FALLBACK) {
12261224
ublk_auto_buf_reg_fallback(ubq, io);
12271225
return true;
12281226
}
@@ -1232,8 +1230,6 @@ static bool ublk_auto_buf_reg(const struct ublk_queue *ubq, struct request *req,
12321230

12331231
io->task_registered_buffers = 1;
12341232
io->buf_ctx_handle = io_uring_cmd_ctx_handle(io->cmd);
1235-
/* store buffer index in request payload */
1236-
io->buf_index = pdu->buf.index;
12371233
io->flags |= UBLK_IO_FLAG_AUTO_BUF_REG;
12381234
return true;
12391235
}
@@ -2005,16 +2001,14 @@ static inline int ublk_check_cmd_op(u32 cmd_op)
20052001
return 0;
20062002
}
20072003

2008-
static inline int ublk_set_auto_buf_reg(struct io_uring_cmd *cmd)
2004+
static inline int ublk_set_auto_buf_reg(struct ublk_io *io, struct io_uring_cmd *cmd)
20092005
{
2010-
struct ublk_uring_cmd_pdu *pdu = ublk_get_uring_cmd_pdu(cmd);
2011-
2012-
pdu->buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr));
2006+
io->buf = ublk_sqe_addr_to_auto_buf_reg(READ_ONCE(cmd->sqe->addr));
20132007

2014-
if (pdu->buf.reserved0 || pdu->buf.reserved1)
2008+
if (io->buf.reserved0 || io->buf.reserved1)
20152009
return -EINVAL;
20162010

2017-
if (pdu->buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK)
2011+
if (io->buf.flags & ~UBLK_AUTO_BUF_REG_F_MASK)
20182012
return -EINVAL;
20192013
return 0;
20202014
}
@@ -2037,10 +2031,10 @@ static int ublk_handle_auto_buf_reg(struct ublk_io *io,
20372031
* this ublk request gets stuck.
20382032
*/
20392033
if (io->buf_ctx_handle == io_uring_cmd_ctx_handle(cmd))
2040-
*buf_idx = io->buf_index;
2034+
*buf_idx = io->buf.index;
20412035
}
20422036

2043-
return ublk_set_auto_buf_reg(cmd);
2037+
return ublk_set_auto_buf_reg(io, cmd);
20442038
}
20452039

20462040
/* Once we return, `io->req` can't be used any more */

0 commit comments

Comments
 (0)