]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
io_uring/net: always use current transfer count for buffer put
authorJens Axboe <axboe@kernel.dk>
Fri, 20 Jun 2025 13:41:21 +0000 (07:41 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 20 Jun 2025 14:33:45 +0000 (08:33 -0600)
A previous fix corrected the retry condition for when to continue a
current bundle, but it missed that the current (not the total) transfer
count also applies to the buffer put. If not, then for incrementally
consumed buffer rings repeated completions on the same request may end
up over consuming.

Reported-by: Roy Tang (ErgoniaTrading) <royonia@ergonia.io>
Cc: stable@vger.kernel.org
Fixes: 3a08988123c8 ("io_uring/net: only retry recv bundle for a full transfer")
Link: https://github.com/axboe/liburing/issues/1423
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/net.c

index e16633fd663025305bd9523011fd4998fd220a23..9550d4c8f866f5501ee2066e90cb0c6902aa8de3 100644 (file)
@@ -821,7 +821,7 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret,
        if (sr->flags & IORING_RECVSEND_BUNDLE) {
                size_t this_ret = *ret - sr->done_io;
 
-               cflags |= io_put_kbufs(req, *ret, io_bundle_nbufs(kmsg, this_ret),
+               cflags |= io_put_kbufs(req, this_ret, io_bundle_nbufs(kmsg, this_ret),
                                      issue_flags);
                if (sr->retry)
                        cflags = req->cqe.flags | (cflags & CQE_F_MASK);