@@ -94,12 +94,32 @@ __cold int io_uring_alloc_task_context(struct task_struct *task,
9494 return 0 ;
9595}
9696
97- int __io_uring_add_tctx_node (struct io_ring_ctx * ctx )
97+ static int io_register_submitter (struct io_ring_ctx * ctx )
98+ {
99+ int ret = 0 ;
100+
101+ mutex_lock (& ctx -> uring_lock );
102+ if (!ctx -> submitter_task )
103+ ctx -> submitter_task = get_task_struct (current );
104+ else if (ctx -> submitter_task != current )
105+ ret = - EEXIST ;
106+ mutex_unlock (& ctx -> uring_lock );
107+
108+ return ret ;
109+ }
110+
111+ int __io_uring_add_tctx_node (struct io_ring_ctx * ctx , bool submitter )
98112{
99113 struct io_uring_task * tctx = current -> io_uring ;
100114 struct io_tctx_node * node ;
101115 int ret ;
102116
117+ if ((ctx -> flags & IORING_SETUP_SINGLE_ISSUER ) && submitter ) {
118+ ret = io_register_submitter (ctx );
119+ if (ret )
120+ return ret ;
121+ }
122+
103123 if (unlikely (!tctx )) {
104124 ret = io_uring_alloc_task_context (current , ctx );
105125 if (unlikely (ret ))
@@ -133,7 +153,8 @@ int __io_uring_add_tctx_node(struct io_ring_ctx *ctx)
133153 list_add (& node -> ctx_node , & ctx -> tctx_list );
134154 mutex_unlock (& ctx -> uring_lock );
135155 }
136- tctx -> last = ctx ;
156+ if (submitter )
157+ tctx -> last = ctx ;
137158 return 0 ;
138159}
139160
@@ -241,7 +262,7 @@ int io_ringfd_register(struct io_ring_ctx *ctx, void __user *__arg,
241262 return - EINVAL ;
242263
243264 mutex_unlock (& ctx -> uring_lock );
244- ret = io_uring_add_tctx_node (ctx );
265+ ret = __io_uring_add_tctx_node (ctx , false );
245266 mutex_lock (& ctx -> uring_lock );
246267 if (ret )
247268 return ret ;
0 commit comments