@@ -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)
{
@@ -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)
/*
@@ -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);
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@samsung.com> --- 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(-)