• Jens Axboe's avatar
    io_uring/net: cache provided buffer group value for multishot receives · b00c51ef
    Jens Axboe authored
    If we're using ring provided buffers with multishot receive, and we end
    up doing an io-wq based issue at some points that also needs to select
    a buffer, we'll lose the initially assigned buffer group as
    io_ring_buffer_select() correctly clears the buffer group list as the
    issue isn't serialized by the ctx uring_lock. This is fine for normal
    receives as the request puts the buffer and finishes, but for multishot,
    we will re-arm and do further receives. On the next trigger for this
    multishot receive, the receive will try and pick from a buffer group
    whose value is the same as the buffer ID of the las receive. That is
    obviously incorrect, and will result in a premature -ENOUFS error for
    the receive even if we had available buffers in the correct group.
    
    Cache the buffer group value at prep time, so we can restore it for
    future receives. This only needs doing for the above mentioned case, but
    just do it by default to keep it easier to read.
    
    Cc: stable@vger.kernel.org
    Fixes: b3fdea6e ("io_uring: multishot recv")
    Fixes: 9bb66906 ("io_uring: support multishot in recvmsg")
    Cc: Dylan Yudaken <dylany@meta.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    b00c51ef
net.c 37.2 KB