• J
    io_uring: add support for backlogged CQ ring · b43c8385
    Jens Axboe 提交于
    commit 1d7bb1d50fb4dc141c7431cc21fdd24ffcc83c76 upstream.
    
    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>
    Signed-off-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
    Reviewed-by: NXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
    b43c8385
io_uring.c 110.9 KB