Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1084,11 +1084,11 @@ static int ipv6_get_mtu(struct net_device *dev)
	int mtu = IPV6_MIN_MTU;
	struct inet6_dev *idev;

	idev = in6_dev_get(dev);
	if (idev) {
	rcu_read_lock();
	idev = __in6_dev_get(dev);
	if (idev)
		mtu = idev->cnf.mtu6;
		in6_dev_put(idev);
	}
	rcu_read_unlock();
	return mtu;
}

@@ -1097,12 +1097,15 @@ int ip6_dst_hoplimit(struct dst_entry *dst)
	int hoplimit = dst_metric(dst, RTAX_HOPLIMIT);
	if (hoplimit < 0) {
		struct net_device *dev = dst->dev;
		struct inet6_dev *idev = in6_dev_get(dev);
		if (idev) {
		struct inet6_dev *idev;

		rcu_read_lock();
		idev = __in6_dev_get(dev);
		if (idev)
			hoplimit = idev->cnf.hop_limit;
			in6_dev_put(idev);
		} else
		else
			hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
		rcu_read_unlock();
	}
	return hoplimit;
}