net: lockless implementation of SO_TXREHASH
authorEric Dumazet <edumazet@google.com>
Thu, 21 Sep 2023 20:28:16 +0000 (20:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Oct 2023 18:09:54 +0000 (19:09 +0100)
sk->sk_txrehash readers are already safe against
concurrent change of this field.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/sock.c

index 4254ed0e4817d60cb2bf9d8e62ffcd98a90f7ec6..f0930f858714b6efdb5b4168d7eb5135f65aded4 100644 (file)
@@ -1181,6 +1181,16 @@ int sk_setsockopt(struct sock *sk, int level, int optname,
                        WRITE_ONCE(sk->sk_pacing_rate, ulval);
                return 0;
                }
+       case SO_TXREHASH:
+               if (val < -1 || val > 1)
+                       return -EINVAL;
+               if ((u8)val == SOCK_TXREHASH_DEFAULT)
+                       val = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);
+               /* Paired with READ_ONCE() in tcp_rtx_synack()
+                * and sk_getsockopt().
+                */
+               WRITE_ONCE(sk->sk_txrehash, (u8)val);
+               return 0;
        }
 
        sockopt_lock_sock(sk);
@@ -1528,19 +1538,6 @@ set_sndbuf:
                break;
        }
 
-       case SO_TXREHASH:
-               if (val < -1 || val > 1) {
-                       ret = -EINVAL;
-                       break;
-               }
-               if ((u8)val == SOCK_TXREHASH_DEFAULT)
-                       val = READ_ONCE(sock_net(sk)->core.sysctl_txrehash);
-               /* Paired with READ_ONCE() in tcp_rtx_synack()
-                * and sk_getsockopt().
-                */
-               WRITE_ONCE(sk->sk_txrehash, (u8)val);
-               break;
-
        default:
                ret = -ENOPROTOOPT;
                break;