• Pavel Begunkov's avatar
    io_uring: skip spinlocking for ->task_complete · f66f7342
    Pavel Begunkov authored
    ->task_complete was added to serialised CQE posting by doing it from
    the task context only (or fallback wq when the task is dead), and now we
    can use that to avoid taking ->completion_lock while filling CQ entries.
    The patch skips spinlocking only in two spots,
    __io_submit_flush_completions() and flushing in io_aux_cqe, it's safer
    and covers all cases we care about. Extra care is taken to force taking
    the lock while queueing overflow entries.
    
    It fundamentally relies on SINGLE_ISSUER to have only one task posting
    events. It also need to take into account overflowed CQEs, flushing of
    which happens in the cq wait path, and so this implementation also needs
    DEFER_TASKRUN to limit waiters. For the same reason we disable it for
    SQPOLL, and for IOPOLL as it won't benefit from it in any case.
    DEFER_TASKRUN, SQPOLL and IOPOLL requirement may be relaxed in the
    future.
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Link: https://lore.kernel.org/r/2a8c91fd82cfcdcc1d2e5bac7051fe2c183bda73.1670384893.git.asml.silence@gmail.com
    [axboe: modify to apply]
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    f66f7342
io_uring.c 109 KB