Pavel I'm sorry...my kernel build process was wrong...the same kernel patch(the first one) was used...I run different load tests on all 3 patches several times your first patch works great and unfortunately second and third patch doesn't work Here the patch summary: first patch works: [1] git://git.kernel.dk/linux-block branch io_uring-5.11, commit dd20166236953c8cd14f4c668bf972af32f0c6be diff --git a/fs/io_uring.c b/fs/io_uring.c index f3690dfdd564..3a98e6dd71c0 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -8919,8 +8919,6 @@ void __io_uring_files_cancel(struct files_struct *files) struct io_ring_ctx *ctx = file->private_data; io_uring_cancel_task_requests(ctx, files); - if (files) - io_uring_del_task_file(file); } atomic_dec(&tctx->in_idle); @@ -8960,6 +8958,8 @@ static s64 tctx_inflight(struct io_uring_task *tctx) void __io_uring_task_cancel(void) { struct io_uring_task *tctx = current->io_uring; + struct file *file; + unsigned long index; DEFINE_WAIT(wait); s64 inflight; @@ -8986,6 +8986,9 @@ void __io_uring_task_cancel(void) finish_wait(&tctx->wait, &wait); atomic_dec(&tctx->in_idle); + + xa_for_each(&tctx->xa, index, file) + io_uring_del_task_file(file); } static int io_uring_flush(struct file *file, void *data) diff --git a/include/linux/io_uring.h b/include/linux/io_uring.h index 35b2d845704d..54925c74aa88 100644 --- a/include/linux/io_uring.h +++ b/include/linux/io_uring.h @@ -48,7 +48,7 @@ static inline void io_uring_task_cancel(void) static inline void io_uring_files_cancel(struct files_struct *files) { if (current->io_uring && !xa_empty(¤t->io_uring->xa)) - __io_uring_files_cancel(files); + __io_uring_task_cancel(); } static inline void io_uring_free(struct task_struct *tsk) { second patch: 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); third patch you already sent which is similar to the second one: https://lore.kernel.org/io-uring/a195a207-db03-6e23-b642-0d04bf7777ec@xxxxxxxxx/T/#t -- Josef