io_uring_flush() { ... if (fatal_signal_pending(current) || (current->flags & PF_EXITING)) io_wq_cancel_pid(ctx->io_wq, task_pid_vnr(current)); } This cancels only the first matched request. The pathset is mainly about fixing that. [1,2] are preps, [3/4] is the fix. The [4/4] tries to improve the worst case for io_uring_cancel_files(), that's when they are a lot of inflights with ->files. Instead of doing {kill(); wait();} one by one, it cancels all of them at once. Pavel Begunkov (4): io-wq: reorder cancellation pending -> running io-wq: add an option to cancel all matched reqs io_uring: cancel all task's requests on exit io_uring: batch cancel in io_uring_cancel_files() fs/io-wq.c | 108 ++++++++++++++++++++++++++------------------------ fs/io-wq.h | 3 +- fs/io_uring.c | 29 ++++++++++++-- 3 files changed, 83 insertions(+), 57 deletions(-) -- 2.24.0