diff options
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r-- | net/ipv6/route.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 10a6cc0aca6c..ec1fedb339cc 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -992,22 +992,26 @@ int icmp6_dst_gc(int *more) | |||
992 | 992 | ||
993 | static int ip6_dst_gc(struct dst_ops *ops) | 993 | static int ip6_dst_gc(struct dst_ops *ops) |
994 | { | 994 | { |
995 | struct net *net = ops->dst_net; | ||
996 | unsigned long now = jiffies; | 995 | unsigned long now = jiffies; |
997 | 996 | struct net *net = ops->dst_net; | |
998 | if (time_after(net->ipv6.ip6_rt_last_gc + net->ipv6.sysctl.ip6_rt_gc_min_interval, now) && | 997 | int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval; |
999 | atomic_read(&net->ipv6.ip6_dst_ops->entries) <= net->ipv6.sysctl.ip6_rt_max_size) | 998 | int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size; |
999 | int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity; | ||
1000 | int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout; | ||
1001 | unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc; | ||
1002 | |||
1003 | if (time_after(rt_last_gc + rt_min_interval, now) && | ||
1004 | atomic_read(&ops->entries) <= rt_max_size) | ||
1000 | goto out; | 1005 | goto out; |
1001 | 1006 | ||
1002 | net->ipv6.ip6_rt_gc_expire++; | 1007 | net->ipv6.ip6_rt_gc_expire++; |
1003 | fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net); | 1008 | fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net); |
1004 | net->ipv6.ip6_rt_last_gc = now; | 1009 | net->ipv6.ip6_rt_last_gc = now; |
1005 | if (atomic_read(&net->ipv6.ip6_dst_ops->entries) < net->ipv6.ip6_dst_ops->gc_thresh) | 1010 | if (atomic_read(&ops->entries) < ops->gc_thresh) |
1006 | net->ipv6.ip6_rt_gc_expire = net->ipv6.sysctl.ip6_rt_gc_timeout>>1; | 1011 | net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1; |
1007 | |||
1008 | out: | 1012 | out: |
1009 | net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>net->ipv6.sysctl.ip6_rt_gc_elasticity; | 1013 | net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>rt_elasticity; |
1010 | return (atomic_read(&net->ipv6.ip6_dst_ops->entries) > net->ipv6.sysctl.ip6_rt_max_size); | 1014 | return (atomic_read(&ops->entries) > rt_max_size); |
1011 | } | 1015 | } |
1012 | 1016 | ||
1013 | /* Clean host part of a prefix. Not necessary in radix tree, | 1017 | /* Clean host part of a prefix. Not necessary in radix tree, |