net: remove DST_NOGC flag

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>
This commit is contained in:
Wei Wang 2017-06-17 10:42:41 -07:00 committed by David S. Miller
parent 5b7c9a8ff8
commit b2a9c0ed75
6 changed files with 9 additions and 19 deletions

View File

@ -57,7 +57,6 @@ struct dst_entry {
#define DST_XFRM_TUNNEL 0x0080 #define DST_XFRM_TUNNEL 0x0080
#define DST_XFRM_QUEUE 0x0100 #define DST_XFRM_QUEUE 0x0100
#define DST_METADATA 0x0200 #define DST_METADATA 0x0200
#define DST_NOGC 0x0400
short error; 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) static inline bool dst_hold_safe(struct dst_entry *dst)
{ {
if (dst->flags & (DST_NOCACHE | DST_NOGC)) return atomic_inc_not_zero(&dst->__refcnt);
return atomic_inc_not_zero(&dst->__refcnt);
dst_hold(dst);
return true;
} }
/** /**

View File

@ -179,14 +179,12 @@ void dst_release(struct dst_entry *dst)
{ {
if (dst) { if (dst) {
int newrefcnt; int newrefcnt;
unsigned short destroy_after_rcu = dst->flags &
(DST_NOCACHE | DST_NOGC);
newrefcnt = atomic_dec_return(&dst->__refcnt); newrefcnt = atomic_dec_return(&dst->__refcnt);
if (unlikely(newrefcnt < 0)) if (unlikely(newrefcnt < 0))
net_warn_ratelimited("%s: dst:%p refcnt:%d\n", net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
__func__, dst, newrefcnt); __func__, dst, newrefcnt);
if (!newrefcnt && unlikely(destroy_after_rcu)) if (!newrefcnt)
call_rcu(&dst->rcu_head, dst_destroy_rcu); call_rcu(&dst->rcu_head, dst_destroy_rcu);
} }
} }

View File

@ -1179,8 +1179,7 @@ make_route:
if (dev_out->flags & IFF_LOOPBACK) if (dev_out->flags & IFF_LOOPBACK)
flags |= RTCF_LOCAL; flags |= RTCF_LOCAL;
rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE, rt = dst_alloc(&dn_dst_ops, dev_out, 1, DST_OBSOLETE_NONE, DST_HOST);
DST_HOST | DST_NOGC);
if (rt == NULL) if (rt == NULL)
goto e_nobufs; goto e_nobufs;
@ -1445,8 +1444,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
} }
make_route: make_route:
rt = dst_alloc(&dn_dst_ops, out_dev, 1, DST_OBSOLETE_NONE, rt = dst_alloc(&dn_dst_ops, out_dev, 1, DST_OBSOLETE_NONE, DST_HOST);
DST_HOST | DST_NOGC);
if (rt == NULL) if (rt == NULL)
goto e_nobufs; goto e_nobufs;

View 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, rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
(will_cache ? 0 : (DST_HOST | DST_NOCACHE)) | (will_cache ? 0 : (DST_HOST | DST_NOCACHE)) |
(nopolicy ? DST_NOPOLICY : 0) | (nopolicy ? DST_NOPOLICY : 0) |
(noxfrm ? DST_NOXFRM : 0) | (noxfrm ? DST_NOXFRM : 0));
DST_NOGC);
if (rt) { if (rt) {
rt->rt_genid = rt_genid_ipv4(dev_net(dev)); 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 *ort = (struct rtable *) dst_orig;
struct rtable *rt; 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) { if (rt) {
struct dst_entry *new = &rt->dst; struct dst_entry *new = &rt->dst;

View File

@ -354,8 +354,7 @@ static struct rt6_info *__ip6_dst_alloc(struct net *net,
int flags) int flags)
{ {
struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev, struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
1, DST_OBSOLETE_FORCE_CHK, 1, DST_OBSOLETE_FORCE_CHK, flags);
flags | DST_NOGC);
if (rt) if (rt)
rt6_info_init(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; struct dst_entry *new = NULL;
rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1, rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1,
DST_OBSOLETE_NONE, DST_NOGC); DST_OBSOLETE_NONE, 0);
if (rt) { if (rt) {
rt6_info_init(rt); rt6_info_init(rt);

View File

@ -1622,7 +1622,7 @@ static inline struct xfrm_dst *xfrm_alloc_dst(struct net *net, int family)
default: default:
BUG(); 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)) { if (likely(xdst)) {
struct dst_entry *dst = &xdst->u.dst; struct dst_entry *dst = &xdst->u.dst;