diff options
| author | Jens Axboe <[email protected]> | 2025-06-13 17:01:49 +0000 |
|---|---|---|
| committer | Jens Axboe <[email protected]> | 2025-06-13 17:01:49 +0000 |
| commit | 26ec15e4b0c1d7b25214d9c0be1d50492e2f006c (patch) | |
| tree | e64962f55304b3f98a518a8dd3a434f027692909 | |
| parent | io_uring: consistently use rcu semantics with sqpoll thread (diff) | |
| download | kernel-26ec15e4b0c1d7b25214d9c0be1d50492e2f006c.tar.gz kernel-26ec15e4b0c1d7b25214d9c0be1d50492e2f006c.zip | |
io_uring/kbuf: don't truncate end buffer for multiple buffer peeks
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: [email protected]
Fixes: 35c8711c8fc4 ("io_uring/kbuf: add helpers for getting/peeking multiple buffers")
Reported-by: Christian Mazakas <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
| -rw-r--r-- | io_uring/kbuf.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c index 2ea65f3cef72..ce95e3af44a9 100644 --- a/io_uring/kbuf.c +++ b/io_uring/kbuf.c @@ -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); |
