net/ipv6: Remove unused code and variables for rt6_info
authorDavid Ahern <dsahern@gmail.com>
Wed, 18 Apr 2018 00:33:27 +0000 (17:33 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Apr 2018 03:41:18 +0000 (23:41 -0400)
Drop unneeded elements from rt6_info struct and rearrange layout to
something more relevant for the data path.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_fib.h
net/ipv6/ip6_fib.c
net/ipv6/route.c
net/ipv6/xfrm6_policy.c

index d41b7bd69fb3833911a336d4caa0d38de13e9ccf..a36116b92100c26b8982d99d7ccdbd42eb3f3b99 100644 (file)
@@ -175,58 +175,20 @@ struct fib6_info {
 
 struct rt6_info {
        struct dst_entry                dst;
-       struct rt6_info __rcu           *rt6_next;
        struct fib6_info                *from;
 
-       /*
-        * Tail elements of dst_entry (__refcnt etc.)
-        * and these elements (rarely used in hot path) are in
-        * the same cache line.
-        */
-       struct fib6_table               *rt6i_table;
-       struct fib6_node __rcu          *rt6i_node;
-
+       struct rt6key                   rt6i_dst;
+       struct rt6key                   rt6i_src;
        struct in6_addr                 rt6i_gateway;
-
-       /* Multipath routes:
-        * siblings is a list of rt6_info that have the the same metric/weight,
-        * destination, but not the same gateway. nsiblings is just a cache
-        * to speed up lookup.
-        */
-       struct list_head                rt6i_siblings;
-       unsigned int                    rt6i_nsiblings;
-
-       atomic_t                        rt6i_ref;
-
-       /* These are in a separate cache line. */
-       struct rt6key                   rt6i_dst ____cacheline_aligned_in_smp;
+       struct inet6_dev                *rt6i_idev;
        u32                             rt6i_flags;
-       struct rt6key                   rt6i_src;
        struct rt6key                   rt6i_prefsrc;
 
        struct list_head                rt6i_uncached;
        struct uncached_list            *rt6i_uncached_list;
 
-       struct inet6_dev                *rt6i_idev;
-       struct rt6_info * __percpu      *rt6i_pcpu;
-       struct rt6_exception_bucket __rcu *rt6i_exception_bucket;
-
-       u32                             rt6i_metric;
        /* more non-fragment space at head required */
        unsigned short                  rt6i_nfheader_len;
-       u8                              rt6i_protocol;
-       u8                              fib6_type;
-       u8                              exception_bucket_flushed:1,
-                                       should_flush:1,
-                                       dst_nocount:1,
-                                       dst_nopolicy:1,
-                                       dst_host:1,
-                                       unused:3;
-
-       unsigned long                   expires;
-       struct dst_metrics              *fib6_metrics;
-#define fib6_pmtu              fib6_metrics->metrics[RTAX_MTU-1]
-       struct fib6_nh                  fib6_nh;
 };
 
 #define for_each_fib6_node_rt_rcu(fn)                                  \
@@ -328,8 +290,6 @@ static inline void ip6_rt_put(struct rt6_info *rt)
        dst_release(&rt->dst);
 }
 
-void rt6_free_pcpu(struct rt6_info *non_pcpu_rt);
-
 struct fib6_info *fib6_info_alloc(gfp_t gfp_flags);
 void fib6_info_destroy(struct fib6_info *f6i);
 
@@ -344,20 +304,6 @@ static inline void fib6_info_release(struct fib6_info *f6i)
                fib6_info_destroy(f6i);
 }
 
-static inline void rt6_hold(struct rt6_info *rt)
-{
-       atomic_inc(&rt->rt6i_ref);
-}
-
-static inline void rt6_release(struct rt6_info *rt)
-{
-       if (atomic_dec_and_test(&rt->rt6i_ref)) {
-               rt6_free_pcpu(rt);
-               dst_dev_put(&rt->dst);
-               dst_release(&rt->dst);
-       }
-}
-
 enum fib6_walk_state {
 #ifdef CONFIG_IPV6_SUBTREES
        FWS_S,
index 77cf43b2d8584457c70ec055c36dc9d3a736d028..2ab49b7cac222695a80c4e4965a88cb7819b273a 100644 (file)
@@ -240,28 +240,6 @@ static void node_free(struct net *net, struct fib6_node *fn)
        net->ipv6.rt6_stats->fib_nodes--;
 }
 
-void rt6_free_pcpu(struct rt6_info *non_pcpu_rt)
-{
-       int cpu;
-
-       if (!non_pcpu_rt->rt6i_pcpu)
-               return;
-
-       for_each_possible_cpu(cpu) {
-               struct rt6_info **ppcpu_rt;
-               struct rt6_info *pcpu_rt;
-
-               ppcpu_rt = per_cpu_ptr(non_pcpu_rt->rt6i_pcpu, cpu);
-               pcpu_rt = *ppcpu_rt;
-               if (pcpu_rt) {
-                       dst_dev_put(&pcpu_rt->dst);
-                       dst_release(&pcpu_rt->dst);
-                       *ppcpu_rt = NULL;
-               }
-       }
-}
-EXPORT_SYMBOL_GPL(rt6_free_pcpu);
-
 static void fib6_free_table(struct fib6_table *table)
 {
        inetpeer_invalidate_tree(&table->tb6_peers);
index 2ccf939e1a204f959554238753a84cbc2bd04726..f9c363327d620322dda2269d8398a5dc5de7aa4e 100644 (file)
@@ -302,10 +302,6 @@ static const struct rt6_info ip6_null_entry_template = {
                .output         = ip6_pkt_discard_out,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
-       .rt6i_protocol  = RTPROT_KERNEL,
-       .rt6i_metric    = ~(u32) 0,
-       .rt6i_ref       = ATOMIC_INIT(1),
-       .fib6_type      = RTN_UNREACHABLE,
 };
 
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
@@ -320,10 +316,6 @@ static const struct rt6_info ip6_prohibit_entry_template = {
                .output         = ip6_pkt_prohibit_out,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
-       .rt6i_protocol  = RTPROT_KERNEL,
-       .rt6i_metric    = ~(u32) 0,
-       .rt6i_ref       = ATOMIC_INIT(1),
-       .fib6_type      = RTN_PROHIBIT,
 };
 
 static const struct rt6_info ip6_blk_hole_entry_template = {
@@ -336,10 +328,6 @@ static const struct rt6_info ip6_blk_hole_entry_template = {
                .output         = dst_discard_out,
        },
        .rt6i_flags     = (RTF_REJECT | RTF_NONEXTHOP),
-       .rt6i_protocol  = RTPROT_KERNEL,
-       .rt6i_metric    = ~(u32) 0,
-       .rt6i_ref       = ATOMIC_INIT(1),
-       .fib6_type      = RTN_BLACKHOLE,
 };
 
 #endif
@@ -349,7 +337,6 @@ static void rt6_info_init(struct rt6_info *rt)
        struct dst_entry *dst = &rt->dst;
 
        memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
-       INIT_LIST_HEAD(&rt->rt6i_siblings);
        INIT_LIST_HEAD(&rt->rt6i_uncached);
 }
 
@@ -999,12 +986,10 @@ static void ip6_rt_copy_init(struct rt6_info *rt, struct fib6_info *ort)
        rt->rt6i_gateway = ort->fib6_nh.nh_gw;
        rt->rt6i_flags = ort->rt6i_flags;
        rt6_set_from(rt, ort);
-       rt->rt6i_metric = ort->rt6i_metric;
 #ifdef CONFIG_IPV6_SUBTREES
        rt->rt6i_src = ort->rt6i_src;
 #endif
        rt->rt6i_prefsrc = ort->rt6i_prefsrc;
-       rt->rt6i_table = ort->rt6i_table;
        rt->dst.lwtstate = lwtstate_get(ort->fib6_nh.nh_lwtstate);
 }
 
@@ -1192,7 +1177,6 @@ static struct rt6_info *ip6_rt_cache_alloc(struct fib6_info *ort,
 
        ip6_rt_copy_init(rt, ort);
        rt->rt6i_flags |= RTF_CACHE;
-       rt->rt6i_metric = 0;
        rt->dst.flags |= DST_HOST;
        rt->rt6i_dst.addr = *daddr;
        rt->rt6i_dst.plen = 128;
@@ -1225,7 +1209,6 @@ static struct rt6_info *ip6_rt_pcpu_alloc(struct fib6_info *rt)
        if (!pcpu_rt)
                return NULL;
        ip6_rt_copy_init(pcpu_rt, rt);
-       pcpu_rt->rt6i_protocol = rt->rt6i_protocol;
        pcpu_rt->rt6i_flags |= RTF_PCPU;
        return pcpu_rt;
 }
@@ -1279,9 +1262,8 @@ static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
                return;
 
        net = dev_net(rt6_ex->rt6i->dst.dev);
-       rt6_ex->rt6i->rt6i_node = NULL;
        hlist_del_rcu(&rt6_ex->hlist);
-       ip6_rt_put(rt6_ex->rt6i);
+       dst_release(&rt6_ex->rt6i->dst);
        kfree_rcu(rt6_ex, rcu);
        WARN_ON_ONCE(!bucket->depth);
        bucket->depth--;
@@ -1463,8 +1445,6 @@ static int rt6_insert_exception(struct rt6_info *nrt,
        }
        rt6_ex->rt6i = nrt;
        rt6_ex->stamp = jiffies;
-       atomic_inc(&nrt->rt6i_ref);
-       nrt->rt6i_node = ort->rt6i_node;
        hlist_add_head_rcu(&rt6_ex->hlist, &bucket->chain);
        bucket->depth++;
        net->ipv6.rt6_stats->fib_rt_cache++;
@@ -2122,7 +2102,6 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
                rt->rt6i_idev = in6_dev_get(loopback_dev);
                rt->rt6i_gateway = ort->rt6i_gateway;
                rt->rt6i_flags = ort->rt6i_flags & ~RTF_PCPU;
-               rt->rt6i_metric = 0;
 
                memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
 #ifdef CONFIG_IPV6_SUBTREES
@@ -2247,8 +2226,7 @@ static void rt6_do_update_pmtu(struct rt6_info *rt, u32 mtu)
 static bool rt6_cache_allowed_for_pmtu(const struct rt6_info *rt)
 {
        return !(rt->rt6i_flags & RTF_CACHE) &&
-               (rt->rt6i_flags & RTF_PCPU ||
-                rcu_access_pointer(rt->rt6i_node));
+               (rt->rt6i_flags & RTF_PCPU || rt->from);
 }
 
 static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
@@ -3313,7 +3291,6 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
        if (on_link)
                nrt->rt6i_flags &= ~RTF_GATEWAY;
 
-       nrt->rt6i_protocol = RTPROT_REDIRECT;
        nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
 
        /* No need to remove rt from the exception table if rt is
index 416fe67271a920f5a86dd3007c03e3113f857f8a..2cff209d0fc1b2d8f4cf17eca80655364ba8a389 100644 (file)
@@ -107,8 +107,6 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
         * it was magically lost, so this code needs audit */
        xdst->u.rt6.rt6i_flags = rt->rt6i_flags & (RTF_ANYCAST |
                                                   RTF_LOCAL);
-       xdst->u.rt6.rt6i_metric = rt->rt6i_metric;
-       xdst->u.rt6.rt6i_node = rt->rt6i_node;
        xdst->route_cookie = rt6_get_cookie(rt);
        xdst->u.rt6.rt6i_gateway = rt->rt6i_gateway;
        xdst->u.rt6.rt6i_dst = rt->rt6i_dst;