• J
    io_uring: add support for backlogged CQ ring · 1d7bb1d5
    Jens Axboe 提交于
    Currently we drop completion events, if the CQ ring is full. That's fine
    for requests with bounded completion times, but it may make it harder or
    impossible to use io_uring with networked IO where request completion
    times are generally unbounded. Or with POLL, for example, which is also
    unbounded.
    
    After this patch, we never overflow the ring, we simply store requests
    in a backlog for later flushing. This flushing is done automatically by
    the kernel. To prevent the backlog from growing indefinitely, if the
    backlog is non-empty, we apply back pressure on IO submissions. Any
    attempt to submit new IO with a non-empty backlog will get an -EBUSY
    return from the kernel. This is a signal to the application that it has
    backlogged CQ events, and that it must reap those before being allowed
    to submit more IO.
    
    Note that if we do return -EBUSY, we will have filled whatever
    backlogged events into the CQ ring first, if there's room. This means
    the application can safely reap events WITHOUT entering the kernel and
    waiting for them, they are already available in the CQ ring.
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    1d7bb1d5
io_uring.c 110.8 KB