Skip to content

Commit

Permalink
io_uring: kill io_sq_thread_fork() and return -EOWNERDEAD if the sq_t…
Browse files Browse the repository at this point in the history
…hread is gone

This brings the behavior back in line with what 5.11 and earlier did,
and this is no longer needed with the improved handling of creds
not needing to do unshare().

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Stefan Metzmacher authored and Jens Axboe committed Mar 7, 2021
1 parent 7c30f36 commit 0414748
Showing 1 changed file with 3 additions and 28 deletions.
31 changes: 3 additions & 28 deletions fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,6 @@ struct io_ring_ctx {
unsigned int drain_next: 1;
unsigned int eventfd_async: 1;
unsigned int restricted: 1;
unsigned int sqo_exec: 1;

/*
* Ring buffer of indices into array of io_uring_sqe, which is
Expand Down Expand Up @@ -6786,7 +6785,6 @@ static int io_sq_thread(void *data)

sqd->thread = NULL;
list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
ctx->sqo_exec = 1;
io_ring_set_wakeup_flag(ctx);
}

Expand Down Expand Up @@ -7846,26 +7844,6 @@ void __io_uring_free(struct task_struct *tsk)
tsk->io_uring = NULL;
}

static int io_sq_thread_fork(struct io_sq_data *sqd, struct io_ring_ctx *ctx)
{
struct task_struct *tsk;
int ret;

clear_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
reinit_completion(&sqd->parked);
ctx->sqo_exec = 0;
sqd->task_pid = current->pid;
tsk = create_io_thread(io_sq_thread, sqd, NUMA_NO_NODE);
if (IS_ERR(tsk))
return PTR_ERR(tsk);
ret = io_uring_alloc_task_context(tsk, ctx);
if (ret)
set_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
sqd->thread = tsk;
wake_up_new_task(tsk);
return ret;
}

static int io_sq_offload_create(struct io_ring_ctx *ctx,
struct io_uring_params *p)
{
Expand Down Expand Up @@ -9199,13 +9177,10 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
if (ctx->flags & IORING_SETUP_SQPOLL) {
io_cqring_overflow_flush(ctx, false, NULL, NULL);

if (unlikely(ctx->sqo_exec)) {
ret = io_sq_thread_fork(ctx->sq_data, ctx);
if (ret)
goto out;
ctx->sqo_exec = 0;
}
ret = -EOWNERDEAD;
if (unlikely(ctx->sq_data->thread == NULL)) {
goto out;
}
if (flags & IORING_ENTER_SQ_WAKEUP)
wake_up(&ctx->sq_data->wait);
if (flags & IORING_ENTER_SQ_WAIT) {
Expand Down

0 comments on commit 0414748

Please sign in to comment.