Commit c68f24cc authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

ipv6: RCU changes in ipv6_get_mtu() and ip6_dst_hoplimit()

Use RCU to avoid atomic ops on idev refcnt in ipv6_get_mtu()
and ip6_dst_hoplimit()
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Acked-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f6bc7d9e
...@@ -1084,11 +1084,11 @@ static int ipv6_get_mtu(struct net_device *dev) ...@@ -1084,11 +1084,11 @@ static int ipv6_get_mtu(struct net_device *dev)
int mtu = IPV6_MIN_MTU; int mtu = IPV6_MIN_MTU;
struct inet6_dev *idev; struct inet6_dev *idev;
idev = in6_dev_get(dev); rcu_read_lock();
if (idev) { idev = __in6_dev_get(dev);
if (idev)
mtu = idev->cnf.mtu6; mtu = idev->cnf.mtu6;
in6_dev_put(idev); rcu_read_unlock();
}
return mtu; return mtu;
} }
...@@ -1097,12 +1097,15 @@ int ip6_dst_hoplimit(struct dst_entry *dst) ...@@ -1097,12 +1097,15 @@ int ip6_dst_hoplimit(struct dst_entry *dst)
int hoplimit = dst_metric(dst, RTAX_HOPLIMIT); int hoplimit = dst_metric(dst, RTAX_HOPLIMIT);
if (hoplimit < 0) { if (hoplimit < 0) {
struct net_device *dev = dst->dev; struct net_device *dev = dst->dev;
struct inet6_dev *idev = in6_dev_get(dev); struct inet6_dev *idev;
if (idev) {
rcu_read_lock();
idev = __in6_dev_get(dev);
if (idev)
hoplimit = idev->cnf.hop_limit; hoplimit = idev->cnf.hop_limit;
in6_dev_put(idev); else
} else
hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit; hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
rcu_read_unlock();
} }
return hoplimit; return hoplimit;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment