• Pavel Begunkov's avatar
    io_uring: replace inflight_wait with tctx->wait · c98de08c
    Pavel Begunkov authored
    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: default avatarPavel Begunkov <asml.silence@gmail.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    c98de08c
io_uring.c 238 KB