diff options
author | Florian Westphal <fw@strlen.de> | 2017-10-16 15:44:36 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-16 21:26:40 +0100 |
commit | 5fa85a09390c4a525cb4d06a0c4644b01a47976b (patch) | |
tree | 83d6e4eee4a33ccd89af13691b484c59489d4f7f /net/ipv4/devinet.c | |
parent | 070cbf5be7774dcf0ceca081c7321c6f2ae833a4 (diff) | |
download | linux-5fa85a09390c4a525cb4d06a0c4644b01a47976b.tar.gz linux-5fa85a09390c4a525cb4d06a0c4644b01a47976b.tar.bz2 linux-5fa85a09390c4a525cb4d06a0c4644b01a47976b.zip |
net: core: rcu-ify rtnl af_ops
rtnl af_ops currently rely on rtnl mutex: unregister (called from module
exit functions) takes the rtnl mutex and all users that do af_ops lookup
also take the rtnl mutex. IOW, parallel rmmod will block until doit()
callback is done.
As none of the af_ops implementation sleep we can use rcu instead.
doit functions that need the af_ops can now use rcu instead of the
rtnl mutex provided the mutex isn't needed for other reasons.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/devinet.c')
-rw-r--r-- | net/ipv4/devinet.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7ce22a2c07ce..6d9b072d903b 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1757,7 +1757,7 @@ static int inet_validate_link_af(const struct net_device *dev, struct nlattr *a, *tb[IFLA_INET_MAX+1]; int err, rem; - if (dev && !__in_dev_get_rtnl(dev)) + if (dev && !__in_dev_get_rcu(dev)) return -EAFNOSUPPORT; err = nla_parse_nested(tb, IFLA_INET_MAX, nla, inet_af_policy, NULL); @@ -1781,7 +1781,7 @@ static int inet_validate_link_af(const struct net_device *dev, static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla) { - struct in_device *in_dev = __in_dev_get_rtnl(dev); + struct in_device *in_dev = __in_dev_get_rcu(dev); struct nlattr *a, *tb[IFLA_INET_MAX+1]; int rem; |