diff options
author | Eric Dumazet <edumazet@google.com> | 2024-08-27 01:52:50 +0000 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-08-28 17:08:17 -0700 |
commit | c0a11493ee6141d475fc96cf3ba24441299c9f16 (patch) | |
tree | 71dd91a1ed63c2f0da76adf59ec690614dd6d02c /net/ipv6 | |
parent | 3e5cbbb1fb9a64588a2c6ddc5e432a303d36a488 (diff) | |
download | lwn-c0a11493ee6141d475fc96cf3ba24441299c9f16.tar.gz lwn-c0a11493ee6141d475fc96cf3ba24441299c9f16.zip |
tcp: annotate data-races around tcptw->tw_rcv_nxt
No lock protects tcp tw fields.
tcptw->tw_rcv_nxt can be changed from twsk_rcv_nxt_update()
while other threads might read this field.
Add READ_ONCE()/WRITE_ONCE() annotations, and make sure
tcp_timewait_state_process() reads tcptw->tw_rcv_nxt only once.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Link: https://patch.msgid.link/20240827015250.3509197-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index fb2e64ce660f..d71ab4e1efe1 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1193,7 +1193,8 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) #endif } - tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, + tcp_v6_send_ack(sk, skb, tcptw->tw_snd_nxt, + READ_ONCE(tcptw->tw_rcv_nxt), tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, tcp_tw_tsval(tcptw), READ_ONCE(tcptw->tw_ts_recent), tw->tw_bound_dev_if, |