diff options
author | Eric Dumazet <edumazet@google.com> | 2019-11-05 14:11:51 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-11-06 16:14:48 -0800 |
commit | 25c7a6d1f90e208ec27ca854b1381ed39842ec57 (patch) | |
tree | a645c406ef309589a1c6f851ca1ba761575a00b4 /include/net/ndisc.h | |
parent | 3828a93f5cfdf5d8a4ff9dead741e9a2871ff57b (diff) | |
download | linux-stable-25c7a6d1f90e208ec27ca854b1381ed39842ec57.tar.gz linux-stable-25c7a6d1f90e208ec27ca854b1381ed39842ec57.tar.bz2 linux-stable-25c7a6d1f90e208ec27ca854b1381ed39842ec57.zip |
net: avoid potential false sharing in neighbor related code
There are common instances of the following construct :
if (n->confirmed != now)
n->confirmed = now;
A C compiler could legally remove the conditional.
Use READ_ONCE()/WRITE_ONCE() to avoid this problem.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/ndisc.h')
-rw-r--r-- | include/net/ndisc.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/include/net/ndisc.h b/include/net/ndisc.h index b2f715ca0567..b5ebeb3b0de0 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -414,8 +414,8 @@ static inline void __ipv6_confirm_neigh(struct net_device *dev, unsigned long now = jiffies; /* avoid dirtying neighbour */ - if (n->confirmed != now) - n->confirmed = now; + if (READ_ONCE(n->confirmed) != now) + WRITE_ONCE(n->confirmed, now); } rcu_read_unlock_bh(); } @@ -431,8 +431,8 @@ static inline void __ipv6_confirm_neigh_stub(struct net_device *dev, unsigned long now = jiffies; /* avoid dirtying neighbour */ - if (n->confirmed != now) - n->confirmed = now; + if (READ_ONCE(n->confirmed) != now) + WRITE_ONCE(n->confirmed, now); } rcu_read_unlock_bh(); } |