* [PATCH stable-6.1 0/3] provided buffer recycling fixes
@ 2025-02-10 17:27 Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 1/3] io_uring: fix multishots with selected buffers Pavel Begunkov
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Pavel Begunkov @ 2025-02-10 17:27 UTC (permalink / raw)
To: stable
Cc: Muhammad Ramdhan, Bing-Jhong Billy Jheng, Jacob Soo, Jens Axboe,
Pavel Begunkov
Fixes for the provided buffers for not allowing kbufs to cross a single
execution section. Upstream had most of it already fixed by chance,
which is why all 3 patches refer to a single upstream commit.
Pavel Begunkov (3):
io_uring: fix multishots with selected buffers
io_uring: fix io_req_prep_async with provided buffers
io_uring/rw: commit provided buffer state on async
io_uring/io_uring.c | 5 ++++-
io_uring/poll.c | 2 ++
io_uring/rw.c | 10 ++++++++++
3 files changed, 16 insertions(+), 1 deletion(-)
--
2.48.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH stable-6.1 1/3] io_uring: fix multishots with selected buffers
2025-02-10 17:27 [PATCH stable-6.1 0/3] provided buffer recycling fixes Pavel Begunkov
@ 2025-02-10 17:27 ` Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 2/3] io_uring: fix io_req_prep_async with provided buffers Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 3/3] io_uring/rw: commit provided buffer state on async Pavel Begunkov
2 siblings, 0 replies; 4+ messages in thread
From: Pavel Begunkov @ 2025-02-10 17:27 UTC (permalink / raw)
To: stable
Cc: Muhammad Ramdhan, Bing-Jhong Billy Jheng, Jacob Soo, Jens Axboe,
Pavel Begunkov
[ upstream commit d63b0e8a628e62ca85a0f7915230186bb92f8bb4 ]
We do io_kbuf_recycle() when arming a poll but every iteration of a
multishot can grab more buffers, which is why we need to flush the kbuf
ring state before continuing with waiting.
Cc: stable@vger.kernel.org
Fixes: b3fdea6ecb55c ("io_uring: multishot recv")
Reported-by: Muhammad Ramdhan <ramdhan@starlabs.sg>
Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
Reported-by: Jacob Soo <jacob.soo@starlabs.sg>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/1bfc9990fe435f1fc6152ca9efeba5eb3e68339c.1738025570.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
io_uring/poll.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/io_uring/poll.c b/io_uring/poll.c
index a4084acaff91..ab27a627fd4c 100644
--- a/io_uring/poll.c
+++ b/io_uring/poll.c
@@ -305,6 +305,8 @@ static int io_poll_check_events(struct io_kiocb *req, bool *locked)
}
} else {
int ret = io_poll_issue(req, locked);
+ io_kbuf_recycle(req, 0);
+
if (ret == IOU_STOP_MULTISHOT)
return IOU_POLL_REMOVE_POLL_USE_RES;
if (ret < 0)
--
2.48.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH stable-6.1 2/3] io_uring: fix io_req_prep_async with provided buffers
2025-02-10 17:27 [PATCH stable-6.1 0/3] provided buffer recycling fixes Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 1/3] io_uring: fix multishots with selected buffers Pavel Begunkov
@ 2025-02-10 17:27 ` Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 3/3] io_uring/rw: commit provided buffer state on async Pavel Begunkov
2 siblings, 0 replies; 4+ messages in thread
From: Pavel Begunkov @ 2025-02-10 17:27 UTC (permalink / raw)
To: stable
Cc: Muhammad Ramdhan, Bing-Jhong Billy Jheng, Jacob Soo, Jens Axboe,
Pavel Begunkov
[ upstream commit d63b0e8a628e62ca85a0f7915230186bb92f8bb4 ]
io_req_prep_async() can import provided buffers, commit the ring state
by giving up on that before, it'll be reimported later if needed.
Reported-by: Muhammad Ramdhan <ramdhan@starlabs.sg>
Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
Reported-by: Jacob Soo <jacob.soo@starlabs.sg>
Fixes: c7fb19428d67d ("io_uring: add support for ring mapped supplied buffers")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/io_uring.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index 64502323be5e..33597284e1cb 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -1624,6 +1624,7 @@ bool io_alloc_async_data(struct io_kiocb *req)
int io_req_prep_async(struct io_kiocb *req)
{
const struct io_op_def *def = &io_op_defs[req->opcode];
+ int ret;
/* assign early for deferred execution for non-fixed file */
if (def->needs_file && !(req->flags & REQ_F_FIXED_FILE) && !req->file)
@@ -1636,7 +1637,9 @@ int io_req_prep_async(struct io_kiocb *req)
if (io_alloc_async_data(req))
return -EAGAIN;
}
- return def->prep_async(req);
+ ret = def->prep_async(req);
+ io_kbuf_recycle(req, 0);
+ return ret;
}
static u32 io_get_sequence(struct io_kiocb *req)
--
2.48.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH stable-6.1 3/3] io_uring/rw: commit provided buffer state on async
2025-02-10 17:27 [PATCH stable-6.1 0/3] provided buffer recycling fixes Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 1/3] io_uring: fix multishots with selected buffers Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 2/3] io_uring: fix io_req_prep_async with provided buffers Pavel Begunkov
@ 2025-02-10 17:27 ` Pavel Begunkov
2 siblings, 0 replies; 4+ messages in thread
From: Pavel Begunkov @ 2025-02-10 17:27 UTC (permalink / raw)
To: stable
Cc: Muhammad Ramdhan, Bing-Jhong Billy Jheng, Jacob Soo, Jens Axboe,
Pavel Begunkov
[ upstream commit d63b0e8a628e62ca85a0f7915230186bb92f8bb4 ]
When we get -EIOCBQUEUED, we need to ensure that the buffer is consumed
from the provided buffer ring, which can be done with io_kbuf_recycle()
+ REQ_F_PARTIAL_IO.
Reported-by: Muhammad Ramdhan <ramdhan@starlabs.sg>
Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
Reported-by: Jacob Soo <jacob.soo@starlabs.sg>
Fixes: c7fb19428d67d ("io_uring: add support for ring mapped supplied buffers")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/rw.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/io_uring/rw.c b/io_uring/rw.c
index 692663bd864f..b75f62dccce6 100644
--- a/io_uring/rw.c
+++ b/io_uring/rw.c
@@ -772,6 +772,8 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
goto done;
ret = 0;
} else if (ret == -EIOCBQUEUED) {
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
if (iovec)
kfree(iovec);
return IOU_ISSUE_SKIP_COMPLETE;
@@ -795,6 +797,9 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
goto done;
}
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
+
io = req->async_data;
s = &io->s;
/*
@@ -935,6 +940,11 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags)
else
ret2 = -EINVAL;
+ if (ret2 == -EIOCBQUEUED) {
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
+ }
+
if (req->flags & REQ_F_REISSUE) {
req->flags &= ~REQ_F_REISSUE;
ret2 = -EAGAIN;
--
2.48.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-02-10 17:27 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-10 17:27 [PATCH stable-6.1 0/3] provided buffer recycling fixes Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 1/3] io_uring: fix multishots with selected buffers Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 2/3] io_uring: fix io_req_prep_async with provided buffers Pavel Begunkov
2025-02-10 17:27 ` [PATCH stable-6.1 3/3] io_uring/rw: commit provided buffer state on async Pavel Begunkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).