Skip to content

Commit

Permalink
ipv6: get rid of icmp6 dst garbage collector
Browse files Browse the repository at this point in the history
icmp6 dst route is currently ref counted during creation and will be
freed by user during its call of dst_release(). So no need of a garbage
collector for it.
Remove all icmp6 dst garbage collector related code.

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>
  • Loading branch information
Wei Wang authored and David S. Miller committed Jun 18, 2017
1 parent 587fea7 commit db91664
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 49 deletions.
1 change: 0 additions & 1 deletion include/net/ip6_route.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
const struct in6_addr *saddr, int oif, int flags);

struct dst_entry *icmp6_dst_alloc(struct net_device *dev, struct flowi6 *fl6);
int icmp6_dst_gc(void);

void fib6_force_start_gc(struct net *net);

Expand Down
3 changes: 1 addition & 2 deletions net/ipv6/ip6_fib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1822,8 +1822,7 @@ void fib6_run_gc(unsigned long expires, struct net *net, bool force)
}
gc_args.timeout = expires ? (int)expires :
net->ipv6.sysctl.ip6_rt_gc_interval;

gc_args.more = icmp6_dst_gc();
gc_args.more = 0;

fib6_clean_all(net, fib6_age, &gc_args);
now = jiffies;
Expand Down
46 changes: 0 additions & 46 deletions net/ipv6/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -1657,9 +1657,6 @@ static unsigned int ip6_mtu(const struct dst_entry *dst)
return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
}

static struct dst_entry *icmp6_dst_gc_list;
static DEFINE_SPINLOCK(icmp6_dst_lock);

struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
struct flowi6 *fl6)
{
Expand Down Expand Up @@ -1697,48 +1694,6 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
return dst;
}

int icmp6_dst_gc(void)
{
struct dst_entry *dst, **pprev;
int more = 0;

spin_lock_bh(&icmp6_dst_lock);
pprev = &icmp6_dst_gc_list;

while ((dst = *pprev) != NULL) {
if (!atomic_read(&dst->__refcnt)) {
*pprev = dst->next;
dst_free(dst);
} else {
pprev = &dst->next;
++more;
}
}

spin_unlock_bh(&icmp6_dst_lock);

return more;
}

static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg),
void *arg)
{
struct dst_entry *dst, **pprev;

spin_lock_bh(&icmp6_dst_lock);
pprev = &icmp6_dst_gc_list;
while ((dst = *pprev) != NULL) {
struct rt6_info *rt = (struct rt6_info *) dst;
if (func(rt, arg)) {
*pprev = dst->next;
dst_free(dst);
} else {
pprev = &dst->next;
}
}
spin_unlock_bh(&icmp6_dst_lock);
}

static int ip6_dst_gc(struct dst_ops *ops)
{
struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
Expand Down Expand Up @@ -2856,7 +2811,6 @@ void rt6_ifdown(struct net *net, struct net_device *dev)
};

fib6_clean_all(net, fib6_ifdown, &adn);
icmp6_clean_all(fib6_ifdown, &adn);
if (dev)
rt6_uncached_list_flush_dev(net, dev);
}
Expand Down

0 comments on commit db91664

Please sign in to comment.