net: remove DST_NOGC flag
authorWei Wang <weiwan@google.com>
Sat, 17 Jun 2017 17:42:41 +0000 (10:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 18 Jun 2017 02:54:01 +0000 (22:54 -0400)
Now that all the components have been changed to release dst based on
refcnt only and not depend on dst gc anymore, we can remove the
temporary flag DST_NOGC.

Note that we also need to remove the DST_NOCACHE check in dst_release()
and dst_hold_safe() because now all the dst are released based on refcnt
and behaves as DST_NOCACHE.

Signed-off-by: Wei Wang <weiwan@google.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dst.h
net/core/dst.c
net/decnet/dn_route.c
net/ipv4/route.c
net/ipv6/route.c
net/xfrm/xfrm_policy.c

index 0c56d1fc4d7f4219da436a8b53e6a7b0410a4142..1be82f672c37904ba13897e2fce428034b3aace3 100644 (file)
@@ -57,7 +57,6 @@ struct dst_entry {
 #define DST_XFRM_TUNNEL                0x0080
 #define DST_XFRM_QUEUE         0x0100
 #define DST_METADATA           0x0200
-#define DST_NOGC               0x0400
 
        short                   error;
 
@@ -336,10 +335,7 @@ static inline void skb_dst_force(struct sk_buff *skb)
  */
 static inline bool dst_hold_safe(struct dst_entry *dst)
 {
-       if (dst->flags & (DST_NOCACHE | DST_NOGC))
-               return atomic_inc_not_zero(&dst->__refcnt);
-       dst_hold(dst);
-       return true;
+       return atomic_inc_not_zero(&dst->__refcnt);
 }
 
 /**
index 30bea01d226208ab1313985b9447bd29c6c28fde..70543dabb797d1a93dd48e81fdf517ef19da24a0 100644 (file)
@@ -179,14 +179,12 @@ void dst_release(struct dst_entry *dst)
 {
        if (dst) {
                int newrefcnt;
-               unsigned short destroy_after_rcu = dst->flags &
-                                                  (DST_NOCACHE | DST_NOGC);
 
                newrefcnt = atomic_dec_return(&dst->__refcnt);
                if (unlikely(newrefcnt < 0))
                        net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
                                             __func__, dst, newrefcnt);
-               if (!newrefcnt && unlikely(destroy_after_rcu))
+               if (!newrefcnt)
                        call_rcu(&dst->rcu_head, dst_destroy_rcu);
        }
 }
index f467c4e3205be170b2c85b4f620108d24225c0cd..5d17d843ac8667e485d65edf6ab52a094ac29d85 100644 (file)
@@ -1179,8 +1179,7 @@ make_route:
        if (dev_out->flags & IFF_LOOPBACK)
                flags |= RTCF_LOCAL;
 
-       rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE,
-                      DST_HOST | DST_NOGC);
+       rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE, DST_HOST);
        if (rt == NULL)
                goto e_nobufs;
 
@@ -1445,8 +1444,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
        }
 
 make_route:
-       rt = dst_alloc(&dn_dst_ops, out_dev, 1, DST_OBSOLETE_NONE,
-                      DST_HOST | DST_NOGC);
+       rt = dst_alloc(&dn_dst_ops, out_dev, 1, DST_OBSOLETE_NONE, DST_HOST);
        if (rt == NULL)
                goto e_nobufs;
 
index 80b30c2bf47d91cba2f29eee4a11243bf3467683..9a0f496f8bf45c4e97d9700e1defd53ea63ce806 100644 (file)
@@ -1496,8 +1496,7 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
        rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
                       (will_cache ? 0 : (DST_HOST | DST_NOCACHE)) |
                       (nopolicy ? DST_NOPOLICY : 0) |
-                      (noxfrm ? DST_NOXFRM : 0) |
-                      DST_NOGC);
+                      (noxfrm ? DST_NOXFRM : 0));
 
        if (rt) {
                rt->rt_genid = rt_genid_ipv4(dev_net(dev));
@@ -2503,7 +2502,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
        struct rtable *ort = (struct rtable *) dst_orig;
        struct rtable *rt;
 
-       rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE, DST_NOGC);
+       rt = dst_alloc(&ipv4_dst_blackhole_ops, NULL, 1, DST_OBSOLETE_NONE, 0);
        if (rt) {
                struct dst_entry *new = &rt->dst;
 
index c88044b8fa7c6f5229e09184d3c3186c0021c439..6b6528fa32921eceb51a2c3d37c5e386ca24a03f 100644 (file)
@@ -354,8 +354,7 @@ static struct rt6_info *__ip6_dst_alloc(struct net *net,
                                        int flags)
 {
        struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
-                                       1, DST_OBSOLETE_FORCE_CHK,
-                                       flags | DST_NOGC);
+                                       1, DST_OBSOLETE_FORCE_CHK, flags);
 
        if (rt)
                rt6_info_init(rt);
@@ -1255,7 +1254,7 @@ struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_ori
        struct dst_entry *new = NULL;
 
        rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1,
-                      DST_OBSOLETE_NONE, DST_NOGC);
+                      DST_OBSOLETE_NONE, 0);
        if (rt) {
                rt6_info_init(rt);
 
index 85e1e13639ccd917d3f053e68ab6ff2fdb54464f..3f7e77f1111287ea1edc984bff428a29bb5fd699 100644 (file)
@@ -1622,7 +1622,7 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
        default:
                BUG();
        }
-       xdst = dst_alloc(dst_ops, NULL, 1, DST_OBSOLETE_NONE, DST_NOGC);
+       xdst = dst_alloc(dst_ops, NULL, 1, DST_OBSOLETE_NONE, 0);
 
        if (likely(xdst)) {
                struct dst_entry *dst = &xdst->u.dst;