• Pavel Begunkov's avatar
    io_uring: don't count rqs failed after current one · 31af27c7
    Pavel Begunkov authored
    When checking for draining with __req_need_defer(), it tries to match
    how many requests were sent before a current one with number of already
    completed. Dropped SQEs are included in req->sequence, and they won't
    ever appear in CQ. To compensate for that, __req_need_defer() substracts
    ctx->cached_sq_dropped.
    However, what it should really use is number of SQEs dropped __before__
    the current one. In other words, any submitted request shouldn't
    shouldn't affect dequeueing from the drain queue of previously submitted
    ones.
    
    Instead of saving proper ctx->cached_sq_dropped in each request,
    substract from req->sequence it at initialisation, so it includes number
    of properly submitted requests.
    
    note: it also changes behaviour of timeouts, but
    1. it's already diverge from the description because of using SQ
    2. the description is ambiguous regarding dropped SQEs
    Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    31af27c7
io_uring.c 191 KB