diff options
author | Eric Dumazet <edumazet@google.com> | 2019-10-11 05:17:42 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-10-13 19:13:08 +0200 |
commit | e0d694d638dba768b47be31c22e1a9b4f862f561 (patch) | |
tree | c35cd9fe92b9008fda870b5ae83b3971e6632a60 /include/net | |
parent | tcp: annotate tp->write_seq lockless reads (diff) | |
download | linux-e0d694d638dba768b47be31c22e1a9b4f862f561.tar.xz linux-e0d694d638dba768b47be31c22e1a9b4f862f561.zip |
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>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/tcp.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h index 8e7c3f6801a9..e1d08f69fd39 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1917,7 +1917,8 @@ static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp) static inline bool tcp_stream_memory_free(const struct sock *sk, int wake) { const struct tcp_sock *tp = tcp_sk(sk); - u32 notsent_bytes = READ_ONCE(tp->write_seq) - tp->snd_nxt; + u32 notsent_bytes = READ_ONCE(tp->write_seq) - + READ_ONCE(tp->snd_nxt); return (notsent_bytes << wake) < tcp_notsent_lowat(tp); } |