> ipip6_tunnel_xmit() runs locklessly (dev->lltx == true) and reads > tunnel->fwmark. > > In preparation for converting ipip6_fill_info() to run without RTNL, > add READ_ONCE() and WRITE_ONCE() annotations around tunnel->fwmark. Acked-by: Lorenzo Bianconi > > Signed-off-by: Eric Dumazet > --- > net/ipv6/sit.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c > index 9a2bbd76d3794849cd11c6530ba1303bf53fa388..e85fa80e80d1ad2c593b860685b9f5bac21e66d9 100644 > --- a/net/ipv6/sit.c > +++ b/net/ipv6/sit.c > @@ -929,7 +929,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb, > if (!dst && !ipip6_tunnel_dst_find(skb, &dst, false)) > goto tx_error; > > - flowi4_init_output(&fl4, tunnel->parms.link, tunnel->fwmark, > + flowi4_init_output(&fl4, tunnel->parms.link, READ_ONCE(tunnel->fwmark), > tos & INET_DSCP_MASK, RT_SCOPE_UNIVERSE, > IPPROTO_IPV6, 0, dst, tiph->saddr, 0, 0, > sock_net_uid(tunnel->net, NULL)); > @@ -1153,7 +1153,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, > t->parms.iph.frag_off = p->iph.frag_off; > if (t->parms.link != p->link || t->fwmark != fwmark) { > t->parms.link = p->link; > - t->fwmark = fwmark; > + WRITE_ONCE(t->fwmark, fwmark); > ipip6_tunnel_bind_dev(t->dev); > } > dst_cache_reset(&t->dst_cache); > @@ -1706,7 +1706,7 @@ static int ipip6_fill_info(struct sk_buff *skb, const struct net_device *dev) > nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->iph.protocol) || > nla_put_be16(skb, IFLA_IPTUN_FLAGS, > ip_tunnel_flags_to_be16(parm->i_flags)) || > - nla_put_u32(skb, IFLA_IPTUN_FWMARK, tunnel->fwmark)) > + nla_put_u32(skb, IFLA_IPTUN_FWMARK, READ_ONCE(tunnel->fwmark))) > goto nla_put_failure; > > #ifdef CONFIG_IPV6_SIT_6RD > -- > 2.55.0.979.g7e5102b832-goog >