io_uring: always go for cancellation spin on exec
authorPavel Begunkov <asml.silence@gmail.com>
Sat, 27 Mar 2021 09:59:30 +0000 (09:59 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 29 Mar 2021 00:11:53 +0000 (18:11 -0600)
Always try to do cancellation in __io_uring_task_cancel() at least once,
so it actually goes and cleans its sqpoll tasks (i.e. via
io_sqpoll_cancel_sync()), otherwise sqpoll task may submit new requests
after cancellation and it's racy for many reasons.

Fixes: 521d6a737a31c ("io_uring: cancel sqpoll via task_work")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/0a21bd6d794bb1629bc906dd57a57b2c2985a8ac.1616839147.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 1949b80677e7924411d28b476a318b17517a482a..a4a944da95a0e0a15460c8304a84ee56c591ec9e 100644 (file)
@@ -9002,6 +9002,8 @@ void __io_uring_task_cancel(void)
 
        /* make sure overflow events are dropped */
        atomic_inc(&tctx->in_idle);
+       __io_uring_files_cancel(NULL);
+
        do {
                /* read completions before cancelations */
                inflight = tctx_inflight(tctx);