io-wq: improve manager/worker handling over exec
exec will cancel any threads, including the ones that io-wq is using. This isn't a problem, in fact we'd prefer it to be that way since it means we know that any async work cancels naturally without having to handle it proactively. But it does mean that we need to setup a new manager, as the manager and workers are gone. Handle this at queue time, and cancel work if we fail. Since the manager can go away without us noticing, ensure that the manager itself holds a reference to the 'wq' as well. Rename io_wq_destroy() to io_wq_put() to reflect that. In the future we can now simplify exec cancelation handling, for now just leave it the same. Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
@@ -2024,7 +2024,7 @@ static void __io_req_task_submit(struct io_kiocb *req)
|
||||
|
||||
/* ctx stays valid until unlock, even if we drop all ours ctx->refs */
|
||||
mutex_lock(&ctx->uring_lock);
|
||||
if (!ctx->sqo_dead && !(current->flags & PF_EXITING))
|
||||
if (!ctx->sqo_dead && !(current->flags & PF_EXITING) && !current->in_execve)
|
||||
__io_queue_sqe(req);
|
||||
else
|
||||
__io_req_task_cancel(req, -EFAULT);
|
||||
@@ -8821,7 +8821,7 @@ void __io_uring_files_cancel(struct files_struct *files)
|
||||
if (files) {
|
||||
io_uring_remove_task_files(tctx);
|
||||
if (tctx->io_wq) {
|
||||
io_wq_destroy(tctx->io_wq);
|
||||
io_wq_put(tctx->io_wq);
|
||||
tctx->io_wq = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user