• Jens Axboe's avatar
    io_uring: commit non-pollable provided mapped buffers upfront · a76c0b31
    Jens Axboe authored
    For recv/recvmsg, IO either completes immediately or gets queued for a
    retry. This isn't the case for read/readv, if eg a normal file or a block
    device is used. Here, an operation can get queued with the block layer.
    If this happens, ring mapped buffers must get committed immediately to
    avoid that the next read can consume the same buffer.
    
    Check if we're dealing with pollable file, when getting a new ring mapped
    provided buffer. If it's not, commit it immediately rather than wait post
    issue. If we don't wait, we can race with completions coming in, or just
    plain buffer reuse by committing after a retry where others could have
    grabbed the same buffer.
    
    Fixes: c7fb1942 ("io_uring: add support for ring mapped supplied buffers")
    Reviewed-by: default avatarHao Xu <howeyxu@tencent.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    a76c0b31
io_uring.c 325 KB