• Jens Axboe's avatar
    io_uring: re-issue block requests that failed because of resources · b63534c4
    Jens Axboe authored
    Mark the plug with nowait == true, which will cause requests to avoid
    blocking on request allocation. If they do, we catch them and reissue
    them from a task_work based handler.
    
    Normally we can catch -EAGAIN directly, but the hard case is for split
    requests. As an example, the application issues a 512KB request. The
    block core will split this into 128KB if that's the max size for the
    device. The first request issues just fine, but we run into -EAGAIN for
    some latter splits for the same request. As the bio is split, we don't
    get to see the -EAGAIN until one of the actual reads complete, and hence
    we cannot handle it inline as part of submission.
    
    This does potentially cause re-reads of parts of the range, as the whole
    request is reissued. There's currently no better way to handle this.
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    b63534c4
io_uring.c 197 KB