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 1dbf51115c30cebab72d95fac43cec91bc9e107b..e10c5cc810827ab8f6e0b52c35623f443137a56d 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 92f29d9505a64f3ef84fc8145225abb967bdcf32..ab7458033ee3b3dd4105d4086ae41e3efec39568 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 */
@@ -219,6 +220,14 @@ enum io_uring_op {
        IORING_OP_LAST,
 };
 
+/*
+ * 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
  */
index 6a6d69523d75dcc1f1f9e0feae562e0c8a72e57f..e50de0b6b9f843f094a3e54923c953d85ee24fc7 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;