]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: add data-race annotations around tp->data_segs_out and tp->total_retrans
authorEric Dumazet <edumazet@google.com>
Thu, 16 Apr 2026 20:03:07 +0000 (20:03 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 18 Apr 2026 18:10:12 +0000 (11:10 -0700)
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must
add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.

Fixes: 7e98102f4897 ("tcp: record pkts sent and retransmistted")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260416200319.3608680-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp.c
net/ipv4/tcp_output.c

index 7b7812cb710f6e05a83615811eefd0cf8a845cab..e39e0734d958f39aa83a33f5c608ce3b94232fb1 100644 (file)
@@ -4434,9 +4434,9 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,
        nla_put_u64_64bit(stats, TCP_NLA_SNDBUF_LIMITED,
                          info.tcpi_sndbuf_limited, TCP_NLA_PAD);
        nla_put_u64_64bit(stats, TCP_NLA_DATA_SEGS_OUT,
-                         tp->data_segs_out, TCP_NLA_PAD);
+                         READ_ONCE(tp->data_segs_out), TCP_NLA_PAD);
        nla_put_u64_64bit(stats, TCP_NLA_TOTAL_RETRANS,
-                         tp->total_retrans, TCP_NLA_PAD);
+                         READ_ONCE(tp->total_retrans), TCP_NLA_PAD);
 
        rate = READ_ONCE(sk->sk_pacing_rate);
        rate64 = (rate != ~0UL) ? rate : ~0ULL;
index 8e99687526a64cef0c8f7b8f0d5ec7a5fa883f09..d8e8bba2d03a3be5e7a9ebac16e39f4a29ae6037 100644 (file)
@@ -1688,7 +1688,8 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
 
        if (skb->len != tcp_header_size) {
                tcp_event_data_sent(tp, sk);
-               tp->data_segs_out += tcp_skb_pcount(skb);
+               WRITE_ONCE(tp->data_segs_out,
+                          tp->data_segs_out + tcp_skb_pcount(skb));
                tp->bytes_sent += skb->len - tcp_header_size;
        }
 
@@ -3642,7 +3643,7 @@ start:
        TCP_ADD_STATS(sock_net(sk), TCP_MIB_RETRANSSEGS, segs);
        if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
                __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPSYNRETRANS);
-       tp->total_retrans += segs;
+       WRITE_ONCE(tp->total_retrans, tp->total_retrans + segs);
        tp->bytes_retrans += skb->len;
 
        /* make sure skb->data is aligned on arches that require it
@@ -4646,7 +4647,8 @@ int tcp_rtx_synack(const struct sock *sk, struct request_sock *req)
                         * However in this case, we are dealing with a passive fastopen
                         * socket thus we can change total_retrans value.
                         */
-                       tcp_sk_rw(sk)->total_retrans++;
+                       WRITE_ONCE(tcp_sk_rw(sk)->total_retrans,
+                                  tcp_sk_rw(sk)->total_retrans + 1);
                }
                trace_tcp_retransmit_synack(sk, req);
                WRITE_ONCE(req->num_retrans, req->num_retrans + 1);