Skip to content

Commit

Permalink
ipv6: RCU changes in ipv6_get_mtu() and ip6_dst_hoplimit()
Browse files Browse the repository at this point in the history
Use RCU to avoid atomic ops on idev refcnt in ipv6_get_mtu()
and ip6_dst_hoplimit()

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Jun 15, 2010
1 parent f6bc7d9 commit c68f24c
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions net/ipv6/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}
Expand Down

0 comments on commit c68f24c

Please sign in to comment.