Skip to content

Commit fd9b854

Browse files
leitaoaxboe
authored andcommitted
io_uring: Pass whole sqe to commands
Currently uring CMD operation relies on having large SQEs, but future operations might want to use normal SQE. The io_uring_cmd currently only saves the payload (cmd) part of the SQE, but, for commands that use normal SQE size, it might be necessary to access the initial SQE fields outside of the payload/cmd block. So, saves the whole SQE other than just the pdu. This changes slightly how the io_uring_cmd works, since the cmd structures and callbacks are not opaque to io_uring anymore. I.e, the callbacks can look at the SQE entries, not only, in the cmd structure. The main advantage is that we don't need to create custom structures for simple commands. Creates io_uring_sqe_cmd() that returns the cmd private data as a null pointer and avoids casting in the callee side. Also, make most of ublk_drv's sqe->cmd priv structure into const, and use io_uring_sqe_cmd() to get the private structure, removing the unwanted cast. (There is one case where the cast is still needed since the header->{len,addr} is updated in the private structure) Suggested-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Keith Busch <kbusch@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/20230504121856.904491-3-leitao@debian.org Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 96c7d4f commit fd9b854

File tree

5 files changed

+24
-22
lines changed

5 files changed

+24
-22
lines changed

drivers/block/ublk_drv.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ static int ublk_ch_mmap(struct file *filp, struct vm_area_struct *vma)
10191019
}
10201020

10211021
static void ublk_commit_completion(struct ublk_device *ub,
1022-
struct ublksrv_io_cmd *ub_cmd)
1022+
const struct ublksrv_io_cmd *ub_cmd)
10231023
{
10241024
u32 qid = ub_cmd->q_id, tag = ub_cmd->tag;
10251025
struct ublk_queue *ubq = ublk_get_queue(ub, qid);
@@ -1263,7 +1263,7 @@ static void ublk_handle_need_get_data(struct ublk_device *ub, int q_id,
12631263

12641264
static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags)
12651265
{
1266-
struct ublksrv_io_cmd *ub_cmd = (struct ublksrv_io_cmd *)cmd->cmd;
1266+
const struct ublksrv_io_cmd *ub_cmd = io_uring_sqe_cmd(cmd->sqe);
12671267
struct ublk_device *ub = cmd->file->private_data;
12681268
struct ublk_queue *ubq;
12691269
struct ublk_io *io;
@@ -1567,7 +1567,7 @@ static struct ublk_device *ublk_get_device_from_id(int idx)
15671567

15681568
static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)
15691569
{
1570-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1570+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
15711571
int ublksrv_pid = (int)header->data[0];
15721572
struct gendisk *disk;
15731573
int ret = -EINVAL;
@@ -1630,7 +1630,7 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)
16301630
static int ublk_ctrl_get_queue_affinity(struct ublk_device *ub,
16311631
struct io_uring_cmd *cmd)
16321632
{
1633-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1633+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
16341634
void __user *argp = (void __user *)(unsigned long)header->addr;
16351635
cpumask_var_t cpumask;
16361636
unsigned long queue;
@@ -1681,7 +1681,7 @@ static inline void ublk_dump_dev_info(struct ublksrv_ctrl_dev_info *info)
16811681

16821682
static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd)
16831683
{
1684-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1684+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
16851685
void __user *argp = (void __user *)(unsigned long)header->addr;
16861686
struct ublksrv_ctrl_dev_info info;
16871687
struct ublk_device *ub;
@@ -1844,7 +1844,7 @@ static int ublk_ctrl_del_dev(struct ublk_device **p_ub)
18441844

18451845
static inline void ublk_ctrl_cmd_dump(struct io_uring_cmd *cmd)
18461846
{
1847-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1847+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
18481848

18491849
pr_devel("%s: cmd_op %x, dev id %d qid %d data %llx buf %llx len %u\n",
18501850
__func__, cmd->cmd_op, header->dev_id, header->queue_id,
@@ -1863,7 +1863,7 @@ static int ublk_ctrl_stop_dev(struct ublk_device *ub)
18631863
static int ublk_ctrl_get_dev_info(struct ublk_device *ub,
18641864
struct io_uring_cmd *cmd)
18651865
{
1866-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1866+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
18671867
void __user *argp = (void __user *)(unsigned long)header->addr;
18681868

18691869
if (header->len < sizeof(struct ublksrv_ctrl_dev_info) || !header->addr)
@@ -1894,7 +1894,7 @@ static void ublk_ctrl_fill_params_devt(struct ublk_device *ub)
18941894
static int ublk_ctrl_get_params(struct ublk_device *ub,
18951895
struct io_uring_cmd *cmd)
18961896
{
1897-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1897+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
18981898
void __user *argp = (void __user *)(unsigned long)header->addr;
18991899
struct ublk_params_header ph;
19001900
int ret;
@@ -1925,7 +1925,7 @@ static int ublk_ctrl_get_params(struct ublk_device *ub,
19251925
static int ublk_ctrl_set_params(struct ublk_device *ub,
19261926
struct io_uring_cmd *cmd)
19271927
{
1928-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1928+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
19291929
void __user *argp = (void __user *)(unsigned long)header->addr;
19301930
struct ublk_params_header ph;
19311931
int ret = -EFAULT;
@@ -1983,7 +1983,7 @@ static void ublk_queue_reinit(struct ublk_device *ub, struct ublk_queue *ubq)
19831983
static int ublk_ctrl_start_recovery(struct ublk_device *ub,
19841984
struct io_uring_cmd *cmd)
19851985
{
1986-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
1986+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
19871987
int ret = -EINVAL;
19881988
int i;
19891989

@@ -2025,7 +2025,7 @@ static int ublk_ctrl_start_recovery(struct ublk_device *ub,
20252025
static int ublk_ctrl_end_recovery(struct ublk_device *ub,
20262026
struct io_uring_cmd *cmd)
20272027
{
2028-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
2028+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
20292029
int ublksrv_pid = (int)header->data[0];
20302030
int ret = -EINVAL;
20312031

@@ -2092,7 +2092,7 @@ static int ublk_char_dev_permission(struct ublk_device *ub,
20922092
static int ublk_ctrl_uring_cmd_permission(struct ublk_device *ub,
20932093
struct io_uring_cmd *cmd)
20942094
{
2095-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
2095+
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)io_uring_sqe_cmd(cmd->sqe);
20962096
bool unprivileged = ub->dev_info.flags & UBLK_F_UNPRIVILEGED_DEV;
20972097
void __user *argp = (void __user *)(unsigned long)header->addr;
20982098
char *dev_path = NULL;
@@ -2171,7 +2171,7 @@ static int ublk_ctrl_uring_cmd_permission(struct ublk_device *ub,
21712171
static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd,
21722172
unsigned int issue_flags)
21732173
{
2174-
struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd;
2174+
const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe);
21752175
struct ublk_device *ub = NULL;
21762176
int ret = -EINVAL;
21772177

drivers/nvme/host/ioctl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
552552
struct io_uring_cmd *ioucmd, unsigned int issue_flags, bool vec)
553553
{
554554
struct nvme_uring_cmd_pdu *pdu = nvme_uring_cmd_pdu(ioucmd);
555-
const struct nvme_uring_cmd *cmd = ioucmd->cmd;
555+
const struct nvme_uring_cmd *cmd = io_uring_sqe_cmd(ioucmd->sqe);
556556
struct request_queue *q = ns ? ns->queue : ctrl->admin_q;
557557
struct nvme_uring_data d;
558558
struct nvme_command c;

include/linux/io_uring.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ enum io_uring_cmd_flags {
2424

2525
struct io_uring_cmd {
2626
struct file *file;
27-
const void *cmd;
27+
const struct io_uring_sqe *sqe;
2828
union {
2929
/* callback to defer completions to task context */
3030
void (*task_work_cb)(struct io_uring_cmd *cmd, unsigned);
@@ -66,6 +66,11 @@ static inline void io_uring_free(struct task_struct *tsk)
6666
if (tsk->io_uring)
6767
__io_uring_free(tsk);
6868
}
69+
70+
static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe)
71+
{
72+
return sqe->cmd;
73+
}
6974
#else
7075
static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
7176
struct iov_iter *iter, void *ioucmd)

io_uring/opdef.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ const struct io_cold_def io_cold_defs[] = {
627627
},
628628
[IORING_OP_URING_CMD] = {
629629
.name = "URING_CMD",
630-
.async_size = uring_cmd_pdu_size(1),
630+
.async_size = 2 * sizeof(struct io_uring_sqe),
631631
.prep_async = io_uring_cmd_prep_async,
632632
},
633633
[IORING_OP_SEND_ZC] = {

io_uring/uring_cmd.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,12 @@ EXPORT_SYMBOL_GPL(io_uring_cmd_done);
6969
int io_uring_cmd_prep_async(struct io_kiocb *req)
7070
{
7171
struct io_uring_cmd *ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
72-
size_t cmd_size;
7372

7473
BUILD_BUG_ON(uring_cmd_pdu_size(0) != 16);
7574
BUILD_BUG_ON(uring_cmd_pdu_size(1) != 80);
7675

77-
cmd_size = uring_cmd_pdu_size(req->ctx->flags & IORING_SETUP_SQE128);
78-
79-
memcpy(req->async_data, ioucmd->cmd, cmd_size);
80-
ioucmd->cmd = req->async_data;
76+
memcpy(req->async_data, ioucmd->sqe, uring_sqe_size(req->ctx));
77+
ioucmd->sqe = req->async_data;
8178
return 0;
8279
}
8380

@@ -103,7 +100,7 @@ int io_uring_cmd_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
103100
req->imu = ctx->user_bufs[index];
104101
io_req_set_rsrc_node(req, ctx, 0);
105102
}
106-
ioucmd->cmd = sqe->cmd;
103+
ioucmd->sqe = sqe;
107104
ioucmd->cmd_op = READ_ONCE(sqe->cmd_op);
108105
return 0;
109106
}

0 commit comments

Comments
 (0)