Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[sfrench/cifs-2.6.git] / net / ipv6 / route.c
index c5e8ecb96426bda619fe242351e40dcf6ff68bcf..f34137d5bf859edef272bfad39baef20c64665ca 100644 (file)
@@ -3209,25 +3209,7 @@ static unsigned int ip6_default_advmss(const struct dst_entry *dst)
 
 INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst)
 {
-       struct inet6_dev *idev;
-       unsigned int mtu;
-
-       mtu = dst_metric_raw(dst, RTAX_MTU);
-       if (mtu)
-               goto out;
-
-       mtu = IPV6_MIN_MTU;
-
-       rcu_read_lock();
-       idev = __in6_dev_get(dst->dev);
-       if (idev)
-               mtu = idev->cnf.mtu6;
-       rcu_read_unlock();
-
-out:
-       mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
-
-       return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
+       return ip6_dst_mtu_maybe_forward(dst, false);
 }
 EXPORT_INDIRECT_CALLABLE(ip6_mtu);
 
@@ -3652,8 +3634,7 @@ out:
        if (err) {
                lwtstate_put(fib6_nh->fib_nh_lws);
                fib6_nh->fib_nh_lws = NULL;
-               if (dev)
-                       dev_put(dev);
+               dev_put(dev);
        }
 
        return err;
@@ -6646,7 +6627,7 @@ int __init ip6_route_init(void)
        ret = -ENOMEM;
        ip6_dst_ops_template.kmem_cachep =
                kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
-                                 SLAB_HWCACHE_ALIGN, NULL);
+                                 SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, NULL);
        if (!ip6_dst_ops_template.kmem_cachep)
                goto out;