ipv6: addrconf_disable_ipv6() optimization
authorEric Dumazet <edumazet@google.com>
Wed, 28 Feb 2024 13:54:27 +0000 (13:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Mar 2024 08:42:31 +0000 (08:42 +0000)
Writing over /proc/sys/net/ipv6/conf/default/disable_ipv6
does not need to hold RTNL.

v3: remove a wrong change (Jakub Kicinski feedback)

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c

index c965400fb93405b4a371dcfef3d629412e105002..6975685f55ea91e55bd08d3f1ebf94ffd414f2b0 100644 (file)
@@ -6399,21 +6399,20 @@ static void addrconf_disable_change(struct net *net, __s32 newf)
 
 static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf)
 {
-       struct net *net;
+       struct net *net = (struct net *)table->extra2;
        int old;
 
+       if (p == &net->ipv6.devconf_dflt->disable_ipv6) {
+               WRITE_ONCE(*p, newf);
+               return 0;
+       }
+
        if (!rtnl_trylock())
                return restart_syscall();
 
-       net = (struct net *)table->extra2;
        old = *p;
        WRITE_ONCE(*p, newf);
 
-       if (p == &net->ipv6.devconf_dflt->disable_ipv6) {
-               rtnl_unlock();
-               return 0;
-       }
-
        if (p == &net->ipv6.devconf_all->disable_ipv6) {
                WRITE_ONCE(net->ipv6.devconf_dflt->disable_ipv6, newf);
                addrconf_disable_change(net, newf);