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

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 44340ff82da53aa97ce170b5cb010929087c0ff1..0e7135a206b095823491d03d6c5e9ca34ac66657 100644 (file)
@@ -6693,20 +6693,19 @@ void addrconf_disable_policy_idev(struct inet6_dev *idev, int val)
 static
 int addrconf_disable_policy(struct ctl_table *ctl, int *valp, int val)
 {
+       struct net *net = (struct net *)ctl->extra2;
        struct inet6_dev *idev;
-       struct net *net;
+
+       if (valp == &net->ipv6.devconf_dflt->disable_policy) {
+               WRITE_ONCE(*valp, val);
+               return 0;
+       }
 
        if (!rtnl_trylock())
                return restart_syscall();
 
        WRITE_ONCE(*valp, val);
 
-       net = (struct net *)ctl->extra2;
-       if (valp == &net->ipv6.devconf_dflt->disable_policy) {
-               rtnl_unlock();
-               return 0;
-       }
-
        if (valp == &net->ipv6.devconf_all->disable_policy)  {
                struct net_device *dev;