]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/kbuf: don't truncate end buffer for multiple buffer peeks
authorJens Axboe <axboe@kernel.dk>
Fri, 13 Jun 2025 17:01:49 +0000 (11:01 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 13 Jun 2025 17:01:49 +0000 (11:01 -0600)
If peeking a bunch of buffers, normally io_ring_buffers_peek() will
truncate the end buffer. This isn't optimal as presumably more data will
be arriving later, and hence it's better to stop with the last full
buffer rather than truncate the end buffer.

Cc: stable@vger.kernel.org
Fixes: 35c8711c8fc4 ("io_uring/kbuf: add helpers for getting/peeking multiple buffers")
Reported-by: Christian Mazakas <christian.mazakas@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/kbuf.c

index 2ea65f3cef72253bffa991b50c336a97a4e4618b..ce95e3af44a99ef536a901f95e4ba37f3e064a89 100644 (file)
@@ -270,8 +270,11 @@ static int io_ring_buffers_peek(struct io_kiocb *req, struct buf_sel_arg *arg,
                /* truncate end piece, if needed, for non partial buffers */
                if (len > arg->max_len) {
                        len = arg->max_len;
-                       if (!(bl->flags & IOBL_INC))
+                       if (!(bl->flags & IOBL_INC)) {
+                               if (iov != arg->iovs)
+                                       break;
                                buf->len = len;
+                       }
                }
 
                iov->iov_base = u64_to_user_ptr(buf->addr);