sock_bindtoindex_locked() needs to use WRITE_ONCE(sk->sk_bound_dev_if, val),
because other cpus/threads might locklessly read this field.
sock_getbindtodevice(), sock_getsockopt() need READ_ONCE()
because they run without socket lock held.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        if (ifindex < 0)
                goto out;
 
-       sk->sk_bound_dev_if = ifindex;
+       /* Paired with all READ_ONCE() done locklessly. */
+       WRITE_ONCE(sk->sk_bound_dev_if, ifindex);
+
        if (sk->sk_prot->rehash)
                sk->sk_prot->rehash(sk);
        sk_dst_reset(sk);
 {
        int ret = -ENOPROTOOPT;
 #ifdef CONFIG_NETDEVICES
+       int bound_dev_if = READ_ONCE(sk->sk_bound_dev_if);
        struct net *net = sock_net(sk);
        char devname[IFNAMSIZ];
 
-       if (sk->sk_bound_dev_if == 0) {
+       if (bound_dev_if == 0) {
                len = 0;
                goto zero;
        }
        if (len < IFNAMSIZ)
                goto out;
 
-       ret = netdev_get_name(net, devname, sk->sk_bound_dev_if);
+       ret = netdev_get_name(net, devname, bound_dev_if);
        if (ret)
                goto out;
 
                break;
 
        case SO_BINDTOIFINDEX:
-               v.val = sk->sk_bound_dev_if;
+               v.val = READ_ONCE(sk->sk_bound_dev_if);
                break;
 
        case SO_NETNS_COOKIE: