]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: adjust rcvbuf in presence of reorders
authorEric Dumazet <edumazet@google.com>
Tue, 13 May 2025 19:39:11 +0000 (19:39 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 15 May 2025 18:30:08 +0000 (11:30 -0700)
This patch takes care of the needed provisioning
when incoming packets are stored in the out of order queue.

This part was not implemented in the correct way, we need
to decouple it from tcp_rcv_space_adjust() logic.

Without it, stalls in the pipe could happen.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250513193919.1089692-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp_input.c

index 89e886bb0fa11666ca4b51b032d536f233078dca..f799200db26492730fbd042a68c8d206d85455d4 100644 (file)
@@ -760,6 +760,9 @@ static void tcp_rcvbuf_grow(struct sock *sk)
        /* slow start: allow the sender to double its rate. */
        rcvwin = tp->rcvq_space.space << 1;
 
+       if (!RB_EMPTY_ROOT(&tp->out_of_order_queue))
+               rcvwin += TCP_SKB_CB(tp->ooo_last_skb)->end_seq - tp->rcv_nxt;
+
        cap = READ_ONCE(net->ipv4.sysctl_tcp_rmem[2]);
 
        rcvbuf = min_t(u32, tcp_space_from_win(sk, rcvwin), cap);
@@ -5166,6 +5169,7 @@ end:
                skb_condense(skb);
                skb_set_owner_r(skb, sk);
        }
+       tcp_rcvbuf_grow(sk);
 }
 
 static int __must_check tcp_queue_rcv(struct sock *sk, struct sk_buff *skb,