On 20/12/2020 15:56, Josef wrote: >> I'd really appreciate if you can try one more. I want to know why >> the final cleanup doesn't cope with it. > > yeah sure, which kernel version? it seems to be that this patch > doesn't match io_uring-5.11 and io_uring-5.10 It's io_uring-5.11 but I had some patches on top. I regenerated it below for up to date Jens' io_uring-5.11 diff --git a/fs/io_uring.c b/fs/io_uring.c index f3690dfdd564..4e1fb4054516 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -8620,6 +8620,10 @@ static int io_remove_personalities(int id, void *p, void *data) return 0; } +static void io_cancel_defer_files(struct io_ring_ctx *ctx, + struct task_struct *task, + struct files_struct *files); + static void io_ring_exit_work(struct work_struct *work) { struct io_ring_ctx *ctx = container_of(work, struct io_ring_ctx, @@ -8633,6 +8637,8 @@ static void io_ring_exit_work(struct work_struct *work) */ do { io_iopoll_try_reap_events(ctx); + io_poll_remove_all(ctx, NULL, NULL); + io_kill_timeouts(ctx, NULL, NULL); } while (!wait_for_completion_timeout(&ctx->ref_comp, HZ/20)); io_ring_ctx_free(ctx); } @@ -8647,6 +8653,7 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx) io_cqring_overflow_flush(ctx, true, NULL, NULL); mutex_unlock(&ctx->uring_lock); + io_cancel_defer_files(ctx, NULL, NULL); io_kill_timeouts(ctx, NULL, NULL); io_poll_remove_all(ctx, NULL, NULL); -- Pavel Begunkov