io_uring: introduce fixed buffer support for io_uring_cmd
authorAnuj Gupta <anuj20.g@samsung.com>
Fri, 30 Sep 2022 06:27:39 +0000 (11:57 +0530)
committerJens Axboe <axboe@kernel.dk>
Fri, 30 Sep 2022 13:50:59 +0000 (07:50 -0600)
Add IORING_URING_CMD_FIXED flag that is to be used for sending io_uring
command with previously registered buffers. User-space passes the buffer
index in sqe->buf_index, same as done in read/write variants that uses
fixed buffers.

Signed-off-by: Anuj Gupta <anuj20.g@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Link: https://lore.kernel.org/r/20220930062749.152261-3-anuj20.g@samsung.com
[axboe: shuffle valid flags check before acting on it]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/io_uring.h
include/uapi/linux/io_uring.h
io_uring/uring_cmd.c

index 1dbf511..e10c5cc 100644 (file)
@@ -28,7 +28,7 @@ struct io_uring_cmd {
                void *cookie;
        };
        u32             cmd_op;
-       u32             pad;
+       u32             flags;
        u8              pdu[32]; /* available inline for free use */
 };
 
index 92f29d9..ab74580 100644 (file)
@@ -56,6 +56,7 @@ struct io_uring_sqe {
                __u32           hardlink_flags;
                __u32           xattr_flags;
                __u32           msg_ring_flags;
+               __u32           uring_cmd_flags;
        };
        __u64   user_data;      /* data to be passed back at completion time */
        /* pack this to avoid bogus arm OABI complaints */
@@ -220,6 +221,14 @@ enum io_uring_op {
 };
 
 /*
+ * sqe->uring_cmd_flags
+ * IORING_URING_CMD_FIXED      use registered buffer; pass thig flag
+ *                             along with setting sqe->buf_index.
+ */
+#define IORING_URING_CMD_FIXED (1U << 0)
+
+
+/*
  * sqe->fsync_flags
  */
 #define IORING_FSYNC_DATASYNC  (1U << 0)
index 6a6d695..e50de0b 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/file.h>
 #include <linux/io_uring.h>
 #include <linux/security.h>
+#include <linux/nospec.h>
 
 #include <uapi/linux/io_uring.h>
 
@@ -77,8 +78,24 @@ int io_uring_cmd_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
        struct io_uring_cmd *ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
 
-       if (sqe->rw_flags || sqe->__pad1)
+       if (sqe->__pad1)
                return -EINVAL;
+
+       ioucmd->flags = READ_ONCE(sqe->uring_cmd_flags);
+       if (ioucmd->flags & ~IORING_URING_CMD_FIXED)
+               return -EINVAL;
+
+       if (ioucmd->flags & IORING_URING_CMD_FIXED) {
+               struct io_ring_ctx *ctx = req->ctx;
+               u16 index;
+
+               req->buf_index = READ_ONCE(sqe->buf_index);
+               if (unlikely(req->buf_index >= ctx->nr_user_bufs))
+                       return -EFAULT;
+               index = array_index_nospec(req->buf_index, ctx->nr_user_bufs);
+               req->imu = ctx->user_bufs[index];
+               io_req_set_rsrc_node(req, ctx, 0);
+       }
        ioucmd->cmd = sqe->cmd;
        ioucmd->cmd_op = READ_ONCE(sqe->cmd_op);
        return 0;