diff options
| author | Christian Brauner <brauner@kernel.org> | 2026-09-21 15:45:01 +0200 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-09-22 15:33:20 +0200 |
| commit | b42c85c20d84ff3e4f0f027d6596c3b3b4a20657 (patch) | |
| tree | 71998c06dec45756ec1c44d6b283cf75d7d4e048 /tools/lib/python/kdoc/python_version.py | |
| parent | 35f322efdbe24dd21a08e4283ed43010d4b6f8c6 (diff) | |
| download | linux-next-b42c85c20d84ff3e4f0f027d6596c3b3b4a20657.tar.gz linux-next-b42c85c20d84ff3e4f0f027d6596c3b3b4a20657.zip | |
exec: cancel io_uring requests before de_thread()
begin_new_exec() cancels the exec'ing thread's io_uring requests after
de_thread() made it the only thread in the thread-group. Now
io_uring_task_cancel() runs task work after. If it runs a
create_worker_cb() item then a io-wq queued on the thread before the
exec creates a new io-wq worker thread.
Said thread joins the thread-group which de_thread() just took down. The
io-iwq sticks around until it notices that its workqueue is dying. But
code after de_thread() relies on being single-threaded.
Move io_uring_task_cancel() before de_thread() but behind the point of
no return. Any worker created during task work run from
io_uring_task_cancel() is just a sibling thread that de_thread() will
take down and reap.
Once io_uring_task_cancel() returned the thread has neither a task
context nor a workqueue left so nothing can add a thread behind
de_thread()'s back anymore.
Suggested-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/aq0_lvHDViIpX_Mu@redhat.com
Fixes: 3bfe6106693b ("io-wq: fork worker threads from original task")
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260921-work-coredump-fixes-v3-12-8e4adb1619e6@kernel.org
Acked-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'tools/lib/python/kdoc/python_version.py')
0 files changed, 0 insertions, 0 deletions
