Add a new flag IORING_URING_CMD_DIRECT that user-space can spcifiy in SQE. If queue is registered with the ring, this flag goes down to the provider of ->uring_cmd. Provider may choose to do things differently or ignore this flag. Also export a helper that allows retrieving the identifier of the registered queue. Signed-off-by: Kanchan Joshi <joshi.k@xxxxxxxxxxx> --- include/linux/io_uring.h | 6 ++++++ include/uapi/linux/io_uring.h | 2 ++ io_uring/uring_cmd.c | 14 +++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/linux/io_uring.h b/include/linux/io_uring.h index 35b9328ca335..bb6f900411e1 100644 --- a/include/linux/io_uring.h +++ b/include/linux/io_uring.h @@ -37,6 +37,7 @@ struct io_uring_cmd { }; #if defined(CONFIG_IO_URING) +int io_uring_cmd_import_qid(void *ioucmd); int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, struct iov_iter *iter, void *ioucmd); void io_uring_cmd_done(struct io_uring_cmd *cmd, ssize_t ret, ssize_t res2, @@ -67,6 +68,11 @@ static inline void io_uring_free(struct task_struct *tsk) __io_uring_free(tsk); } #else +static inline int io_uring_cmd_import_qid(void *ioucmd) +{ + return -EOPNOTSUPP; +} + static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, struct iov_iter *iter, void *ioucmd) { diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index a9d59bfd26f7..67fbcfd3f676 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -232,8 +232,10 @@ enum io_uring_op { * sqe->uring_cmd_flags * IORING_URING_CMD_FIXED use registered buffer; pass this flag * along with setting sqe->buf_index. + * IORING_URING_CMD_DIRECT use registered queue for this cmd. */ #define IORING_URING_CMD_FIXED (1U << 0) +#define IORING_URING_CMD_DIRECT (1U << 1) /* diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c index 5113c9a48583..2a543b490045 100644 --- a/io_uring/uring_cmd.c +++ b/io_uring/uring_cmd.c @@ -89,9 +89,12 @@ int io_uring_cmd_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) return -EINVAL; ioucmd->flags = READ_ONCE(sqe->uring_cmd_flags); - if (ioucmd->flags & ~IORING_URING_CMD_FIXED) + if (ioucmd->flags & ~(IORING_URING_CMD_FIXED | IORING_URING_CMD_DIRECT)) return -EINVAL; + if (ioucmd->flags & IORING_URING_CMD_DIRECT && + req->ctx->dev_qid == -EINVAL) + return -EINVAL; if (ioucmd->flags & IORING_URING_CMD_FIXED) { struct io_ring_ctx *ctx = req->ctx; u16 index; @@ -162,3 +165,12 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw, return io_import_fixed(rw, iter, req->imu, ubuf, len); } EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed); + +int io_uring_cmd_import_qid(void *ioucmd) +{ + struct io_kiocb *req = cmd_to_io_kiocb(ioucmd); + struct io_ring_ctx *ctx = req->ctx; + + return ctx->dev_qid; +} +EXPORT_SYMBOL_GPL(io_uring_cmd_import_qid); -- 2.25.1