io_uring: replace inflight_wait with tctx->wait
authorPavel Begunkov <asml.silence@gmail.com>
Sun, 15 Nov 2020 12:56:32 +0000 (12:56 +0000)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Dec 2020 19:04:01 +0000 (12:04 -0700)
commitc98de08c990e190fc7cc3aaf8079b4a0674c6425
treed5c7bfd8f228e42c32a3392bd7e253c543e96e39
parent10cad2c40dcb04bb46b2bf399e00ca5ea93d36b0
io_uring: replace inflight_wait with tctx->wait

As tasks now cancel only theirs requests, and inflight_wait is awaited
only in io_uring_cancel_files(), which should be called with ->in_idle
set, instead of keeping a separate inflight_wait use tctx->wait.

That will add some spurious wakeups but actually is safer from point of
not hanging the task.

e.g.
task1                   | IRQ
                        | *start* io_complete_rw_common(link)
                        |        link: req1 -> req2 -> req3(with files)
*cancel_files()         |
io_wq_cancel(), etc.    |
                        | put_req(link), adds to io-wq req2
schedule()              |

So, task1 will never try to cancel req2 or req3. If req2 is
long-standing (e.g. read(empty_pipe)), this may hang.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c