io_uring: add IORING_SETUP_SINGLE_ISSUER
[platform/kernel/linux-starfive.git] / io_uring / tctx.c
index 5a5d4f9..a819da8 100644 (file)
@@ -94,12 +94,32 @@ __cold int io_uring_alloc_task_context(struct task_struct *task,
        return 0;
 }
 
-int __io_uring_add_tctx_node(struct io_ring_ctx *ctx)
+static int io_register_submitter(struct io_ring_ctx *ctx)
+{
+       int ret = 0;
+
+       mutex_lock(&ctx->uring_lock);
+       if (!ctx->submitter_task)
+               ctx->submitter_task = get_task_struct(current);
+       else if (ctx->submitter_task != current)
+               ret = -EEXIST;
+       mutex_unlock(&ctx->uring_lock);
+
+       return ret;
+}
+
+int __io_uring_add_tctx_node(struct io_ring_ctx *ctx, bool submitter)
 {
        struct io_uring_task *tctx = current->io_uring;
        struct io_tctx_node *node;
        int ret;
 
+       if ((ctx->flags & IORING_SETUP_SINGLE_ISSUER) && submitter) {
+               ret = io_register_submitter(ctx);
+               if (ret)
+                       return ret;
+       }
+
        if (unlikely(!tctx)) {
                ret = io_uring_alloc_task_context(current, ctx);
                if (unlikely(ret))
@@ -133,7 +153,8 @@ int __io_uring_add_tctx_node(struct io_ring_ctx *ctx)
                list_add(&node->ctx_node, &ctx->tctx_list);
                mutex_unlock(&ctx->uring_lock);
        }
-       tctx->last = ctx;
+       if (submitter)
+               tctx->last = ctx;
        return 0;
 }
 
@@ -241,7 +262,7 @@ int io_ringfd_register(struct io_ring_ctx *ctx, void __user *__arg,
                return -EINVAL;
 
        mutex_unlock(&ctx->uring_lock);
-       ret = io_uring_add_tctx_node(ctx);
+       ret = __io_uring_add_tctx_node(ctx, false);
        mutex_lock(&ctx->uring_lock);
        if (ret)
                return ret;