Commit f694eee9 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

ip_tunnel: annotate data-races around t->parms.link

t->parms.link is read locklessly, annotate these reads
and opposite writes accordingly.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1c07dbb0
...@@ -102,9 +102,8 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, ...@@ -102,9 +102,8 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
if (!ip_tunnel_key_match(&t->parms, flags, key)) if (!ip_tunnel_key_match(&t->parms, flags, key))
continue; continue;
if (t->parms.link == link) if (READ_ONCE(t->parms.link) == link)
return t; return t;
else
cand = t; cand = t;
} }
...@@ -117,9 +116,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, ...@@ -117,9 +116,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
if (!ip_tunnel_key_match(&t->parms, flags, key)) if (!ip_tunnel_key_match(&t->parms, flags, key))
continue; continue;
if (t->parms.link == link) if (READ_ONCE(t->parms.link) == link)
return t; return t;
else if (!cand) if (!cand)
cand = t; cand = t;
} }
...@@ -137,9 +136,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, ...@@ -137,9 +136,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
if (!ip_tunnel_key_match(&t->parms, flags, key)) if (!ip_tunnel_key_match(&t->parms, flags, key))
continue; continue;
if (t->parms.link == link) if (READ_ONCE(t->parms.link) == link)
return t; return t;
else if (!cand) if (!cand)
cand = t; cand = t;
} }
...@@ -150,9 +149,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn, ...@@ -150,9 +149,9 @@ struct ip_tunnel *ip_tunnel_lookup(struct ip_tunnel_net *itn,
!(t->dev->flags & IFF_UP)) !(t->dev->flags & IFF_UP))
continue; continue;
if (t->parms.link == link) if (READ_ONCE(t->parms.link) == link)
return t; return t;
else if (!cand) if (!cand)
cand = t; cand = t;
} }
...@@ -221,7 +220,7 @@ static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn, ...@@ -221,7 +220,7 @@ static struct ip_tunnel *ip_tunnel_find(struct ip_tunnel_net *itn,
hlist_for_each_entry_rcu(t, head, hash_node) { hlist_for_each_entry_rcu(t, head, hash_node) {
if (local == t->parms.iph.saddr && if (local == t->parms.iph.saddr &&
remote == t->parms.iph.daddr && remote == t->parms.iph.daddr &&
link == t->parms.link && link == READ_ONCE(t->parms.link) &&
type == t->dev->type && type == t->dev->type &&
ip_tunnel_key_match(&t->parms, flags, key)) ip_tunnel_key_match(&t->parms, flags, key))
break; break;
...@@ -747,7 +746,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, ...@@ -747,7 +746,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr, ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr,
tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.o_key, RT_TOS(tos),
dev_net(dev), tunnel->parms.link, dev_net(dev), READ_ONCE(tunnel->parms.link),
tunnel->fwmark, skb_get_hash(skb), 0); tunnel->fwmark, skb_get_hash(skb), 0);
if (ip_tunnel_encap(skb, &tunnel->encap, &protocol, &fl4) < 0) if (ip_tunnel_encap(skb, &tunnel->encap, &protocol, &fl4) < 0)
...@@ -867,7 +866,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn, ...@@ -867,7 +866,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn,
if (t->parms.link != p->link || t->fwmark != fwmark) { if (t->parms.link != p->link || t->fwmark != fwmark) {
int mtu; int mtu;
t->parms.link = p->link; WRITE_ONCE(t->parms.link, p->link);
t->fwmark = fwmark; t->fwmark = fwmark;
mtu = ip_tunnel_bind_dev(dev); mtu = ip_tunnel_bind_dev(dev);
if (set_mtu) if (set_mtu)
...@@ -1057,9 +1056,9 @@ EXPORT_SYMBOL(ip_tunnel_get_link_net); ...@@ -1057,9 +1056,9 @@ EXPORT_SYMBOL(ip_tunnel_get_link_net);
int ip_tunnel_get_iflink(const struct net_device *dev) int ip_tunnel_get_iflink(const struct net_device *dev)
{ {
struct ip_tunnel *tunnel = netdev_priv(dev); const struct ip_tunnel *tunnel = netdev_priv(dev);
return tunnel->parms.link; return READ_ONCE(tunnel->parms.link);
} }
EXPORT_SYMBOL(ip_tunnel_get_iflink); EXPORT_SYMBOL(ip_tunnel_get_iflink);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment