• Pavel Begunkov's avatar
    io_uring: remove submission references · 5d5901a3
    Pavel Begunkov authored
    Requests are by default given with two references, submission and
    completion. Completion references are straightforward, they represent
    request ownership and are put when a request is completed or so.
    Submission references are a bit more trickier. They're needed when
    io_issue_sqe() followed deep into the submission stack (e.g. in fs,
    block, drivers, etc.), request may have given away for concurrent
    execution or already completed, and the code unwinding back to
    io_issue_sqe() may be accessing some pieces of our requests, e.g.
    file or iov.
    
    Now, we prevent such async/in-depth completions by pushing requests
    through task_work. Punting to io-wq is also done through task_works,
    apart from a couple of cases with a pretty well known context. So,
    there're two cases:
    1) io_issue_sqe() from the task context and protected by ->uring_lock.
    Either requests return back to io_uring or handed to task_work, which
    won't be executed because we're currently controlling that task. So,
    we can be sure that requests are staying alive all the time and we don't
    need submission references to pin them.
    
    2) io_issue_sqe() from io-wq, which doesn't hold the mutex. The role of
    submission reference is played by io-wq reference, which is put by
    io_wq_submit_work(). Hence, it should be fine.
    
    Considering that, we can carefully kill the submission reference.
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Link: https://lore.kernel.org/r/6b68f1c763229a590f2a27148aee77767a8d7750.1628705069.git.asml.silence@gmail.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    5d5901a3
io_uring.c 253 KB