We could have triggered task work when we removed poll completions. It's now safe to unconditionally call task_work_run() since it checks for the exited task work, do so in case we have pending items there. Ensure we do so before flushing the CQ ring overflow. Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- fs/io_uring.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index 1579390c7c53..183bd28761e3 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -7295,10 +7295,13 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx) io_wq_cancel_all(ctx->io_wq); io_iopoll_reap_events(ctx); + idr_for_each(&ctx->personality_idr, io_remove_personalities, ctx); + task_work_run(); + /* if we failed setting up the ctx, we might not have any rings */ if (ctx->rings) io_cqring_overflow_flush(ctx, true); - idr_for_each(&ctx->personality_idr, io_remove_personalities, ctx); + wait_for_completion(&ctx->completions[0]); io_ring_ctx_free(ctx); } -- 2.26.0