diff options
author | Eric Dumazet <edumazet@google.com> | 2024-02-28 14:54:36 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2024-03-01 09:42:32 +0100 |
commit | 45b90ec9a214ff7fbde8190126301a07387c46e5 (patch) | |
tree | e532d2682cb1701c812c0185c811d0c54ce146b2 /net/ipv6 | |
parent | ipv6: annotate data-races around devconf->disable_policy (diff) | |
download | linux-45b90ec9a214ff7fbde8190126301a07387c46e5.tar.xz linux-45b90ec9a214ff7fbde8190126301a07387c46e5.zip |
ipv6: addrconf_disable_policy() optimization
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>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 44340ff82da5..0e7135a206b0 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -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; |