]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: tcp_tx_timestamp() must look at the rtx queue
authorEric Dumazet <edumazet@google.com>
Tue, 27 Jan 2026 12:38:27 +0000 (12:38 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 Jan 2026 03:35:35 +0000 (19:35 -0800)
tcp_tx_timestamp() is only called at the end of tcp_sendmsg_locked()
before the final tcp_push().

By the time it is called, it is possible all the copied data
has been sent already (transmit queue is empty).

If this is the case, use the last skb in the rtx queue.

Fixes: 75c119afe14f ("tcp: implement rb-tree based retransmit queue")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Link: https://patch.msgid.link/20260127123828.4098577-2-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp.c

index d95b5b8c1ffc8b63e97495f0b7ae894aefbe41b5..e4009158b908a8d917e18a3cf20b3cb968f2dc06 100644 (file)
@@ -501,6 +501,9 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc)
        struct sk_buff *skb = tcp_write_queue_tail(sk);
        u32 tsflags = sockc->tsflags;
 
+       if (unlikely(!skb))
+               skb = skb_rb_last(&sk->tcp_rtx_queue);
+
        if (tsflags && skb) {
                struct skb_shared_info *shinfo = skb_shinfo(skb);
                struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);