tcp: annotate tp->snd_nxt lockless reads
There are few places where we fetch tp->snd_nxt while this field can change from IRQ or other cpu. We need to add READ_ONCE() annotations, and also make sure write sides use corresponding WRITE_ONCE() to avoid store-tearing. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
0f31746452
commit
e0d694d638
@@ -67,7 +67,7 @@ static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
unsigned int prior_packets = tp->packets_out;
|
||||
|
||||
tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
|
||||
WRITE_ONCE(tp->snd_nxt, TCP_SKB_CB(skb)->end_seq);
|
||||
|
||||
__skb_unlink(skb, &sk->sk_write_queue);
|
||||
tcp_rbtree_insert(&sk->tcp_rtx_queue, skb);
|
||||
@@ -3142,7 +3142,7 @@ void tcp_send_fin(struct sock *sk)
|
||||
* if FIN had been sent. This is because retransmit path
|
||||
* does not change tp->snd_nxt.
|
||||
*/
|
||||
tp->snd_nxt++;
|
||||
WRITE_ONCE(tp->snd_nxt, tp->snd_nxt + 1);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@@ -3426,7 +3426,7 @@ static void tcp_connect_init(struct sock *sk)
|
||||
tp->snd_una = tp->write_seq;
|
||||
tp->snd_sml = tp->write_seq;
|
||||
tp->snd_up = tp->write_seq;
|
||||
tp->snd_nxt = tp->write_seq;
|
||||
WRITE_ONCE(tp->snd_nxt, tp->write_seq);
|
||||
|
||||
if (likely(!tp->repair))
|
||||
tp->rcv_nxt = 0;
|
||||
@@ -3586,11 +3586,11 @@ int tcp_connect(struct sock *sk)
|
||||
/* We change tp->snd_nxt after the tcp_transmit_skb() call
|
||||
* in order to make this packet get counted in tcpOutSegs.
|
||||
*/
|
||||
tp->snd_nxt = tp->write_seq;
|
||||
WRITE_ONCE(tp->snd_nxt, tp->write_seq);
|
||||
tp->pushed_seq = tp->write_seq;
|
||||
buff = tcp_send_head(sk);
|
||||
if (unlikely(buff)) {
|
||||
tp->snd_nxt = TCP_SKB_CB(buff)->seq;
|
||||
WRITE_ONCE(tp->snd_nxt, TCP_SKB_CB(buff)->seq);
|
||||
tp->pushed_seq = TCP_SKB_CB(buff)->seq;
|
||||
}
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_ACTIVEOPENS);
|
||||
|
||||
Reference in New Issue
Block a user