io_uring: register single issuer task at creation
authorDylan Yudaken <dylany@fb.com>
Mon, 26 Sep 2022 17:09:25 +0000 (10:09 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 26 Sep 2022 17:26:18 +0000 (11:26 -0600)
Instead of picking the task from the first submitter task, rather use the
creator task or in the case of disabled (IORING_SETUP_R_DISABLED) the
enabling task.

This approach allows a lot of simplification of the logic here. This
removes init logic from the submission path, which can always be a bit
confusing, but also removes the need for locking to write (or read) the
submitter_task.

Users that want to move a ring before submitting can create the ring
disabled and then enable it on the submitting task.

Signed-off-by: Dylan Yudaken <dylany@fb.com>
Fixes: 97bbdc06a444 ("io_uring: add IORING_SETUP_SINGLE_ISSUER")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index 2965b354efc8e2745e3f9589511fc5cbe515a313..242d896c00f343e790600492dd314b56ba616cee 100644 (file)
@@ -3357,6 +3357,10 @@ static __cold int io_uring_create(unsigned entries, struct io_uring_params *p,
                goto err;
        }
 
+       if (ctx->flags & IORING_SETUP_SINGLE_ISSUER
+           && !(ctx->flags & IORING_SETUP_R_DISABLED))
+               ctx->submitter_task = get_task_struct(current);
+
        file = io_uring_get_file(ctx);
        if (IS_ERR(file)) {
                ret = PTR_ERR(file);
@@ -3548,6 +3552,9 @@ static int io_register_enable_rings(struct io_ring_ctx *ctx)
        if (!(ctx->flags & IORING_SETUP_R_DISABLED))
                return -EBADFD;
 
+       if (ctx->flags & IORING_SETUP_SINGLE_ISSUER && !ctx->submitter_task)
+               ctx->submitter_task = get_task_struct(current);
+
        if (ctx->restrictions.registered)
                ctx->restricted = 1;