Skip to content

Commit

Permalink
io_uring: SQPOLL stop error handling fixes
Browse files Browse the repository at this point in the history
If we fail to fork an SQPOLL worker, we can hit cancel, and hence
attempted thread stop, with the thread already being stopped. Ensure
we check for that.

Also guard thread stop fully by the sqd mutex, just like we do for
park.

Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Mar 4, 2021
1 parent 470ec4e commit e54945a
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -6793,9 +6793,9 @@ static int io_sq_thread(void *data)
ctx->sqo_exec = 1;
io_ring_set_wakeup_flag(ctx);
}
mutex_unlock(&sqd->lock);

complete(&sqd->exited);
mutex_unlock(&sqd->lock);
do_exit(0);
}

Expand Down Expand Up @@ -7118,13 +7118,19 @@ static bool io_sq_thread_park(struct io_sq_data *sqd)

static void io_sq_thread_stop(struct io_sq_data *sqd)
{
if (!sqd->thread)
if (test_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state))
return;

set_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
WARN_ON_ONCE(test_bit(IO_SQ_THREAD_SHOULD_PARK, &sqd->state));
wake_up_process(sqd->thread);
wait_for_completion(&sqd->exited);
mutex_lock(&sqd->lock);
if (sqd->thread) {
set_bit(IO_SQ_THREAD_SHOULD_STOP, &sqd->state);
WARN_ON_ONCE(test_bit(IO_SQ_THREAD_SHOULD_PARK, &sqd->state));
wake_up_process(sqd->thread);
mutex_unlock(&sqd->lock);
wait_for_completion(&sqd->exited);
WARN_ON_ONCE(sqd->thread);
} else {
mutex_unlock(&sqd->lock);
}
}

static void io_put_sq_data(struct io_sq_data *sqd)
Expand Down Expand Up @@ -8867,6 +8873,11 @@ static void io_uring_cancel_sqpoll(struct io_ring_ctx *ctx)
if (!io_sq_thread_park(sqd))
return;
tctx = ctx->sq_data->thread->io_uring;
/* can happen on fork/alloc failure, just ignore that state */
if (!tctx) {
io_sq_thread_unpark(sqd);
return;
}

atomic_inc(&tctx->in_idle);
do {
Expand Down

0 comments on commit e54945a

Please sign in to comment.