diff options
author | Benjamin Thery <benjamin.thery@bull.net> | 2008-03-04 16:49:47 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-04 16:49:47 -0500 |
commit | 6891a346c387bd0a64afa50f4522f5fe8ba879d8 (patch) | |
tree | 04f02aa5ea701d01baecb4ff34064d075ffe4d7a /net/ipv6/route.c | |
parent | f2fc6a54585a1be6669613a31fbaba2ecbadcd36 (diff) |
[NETNS][IPV6] route6 - make garbage collection work with multiple network namespaces
This patch makes the necessary changes to make IPv6 dst_entry garbage
collection work with multiple network namespaces.
In ip6_dst_gc(), static local variables are now declared
per-namespace.
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r-- | net/ipv6/route.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index d88b6ec3c5d1..10a6cc0aca6c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -992,23 +992,22 @@ 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 | static unsigned expire = 30*HZ; | 995 | struct net *net = ops->dst_net; |
996 | static unsigned long last_gc; | ||
997 | unsigned long now = jiffies; | 996 | unsigned long now = jiffies; |
998 | 997 | ||
999 | if (time_after(last_gc + init_net.ipv6.sysctl.ip6_rt_gc_min_interval, now) && | 998 | if (time_after(net->ipv6.ip6_rt_last_gc + net->ipv6.sysctl.ip6_rt_gc_min_interval, now) && |
1000 | atomic_read(&init_net.ipv6.ip6_dst_ops->entries) <= init_net.ipv6.sysctl.ip6_rt_max_size) | 999 | atomic_read(&net->ipv6.ip6_dst_ops->entries) <= net->ipv6.sysctl.ip6_rt_max_size) |
1001 | goto out; | 1000 | goto out; |
1002 | 1001 | ||
1003 | expire++; | 1002 | net->ipv6.ip6_rt_gc_expire++; |
1004 | fib6_run_gc(expire, &init_net); | 1003 | fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net); |
1005 | last_gc = now; | 1004 | net->ipv6.ip6_rt_last_gc = now; |
1006 | if (atomic_read(&init_net.ipv6.ip6_dst_ops->entries) < init_net.ipv6.ip6_dst_ops->gc_thresh) | 1005 | if (atomic_read(&net->ipv6.ip6_dst_ops->entries) < net->ipv6.ip6_dst_ops->gc_thresh) |
1007 | expire = init_net.ipv6.sysctl.ip6_rt_gc_timeout>>1; | 1006 | net->ipv6.ip6_rt_gc_expire = net->ipv6.sysctl.ip6_rt_gc_timeout>>1; |
1008 | 1007 | ||
1009 | out: | 1008 | out: |
1010 | expire -= expire>>init_net.ipv6.sysctl.ip6_rt_gc_elasticity; | 1009 | net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>net->ipv6.sysctl.ip6_rt_gc_elasticity; |
1011 | return (atomic_read(&init_net.ipv6.ip6_dst_ops->entries) > init_net.ipv6.sysctl.ip6_rt_max_size); | 1010 | return (atomic_read(&net->ipv6.ip6_dst_ops->entries) > net->ipv6.sysctl.ip6_rt_max_size); |
1012 | } | 1011 | } |
1013 | 1012 | ||
1014 | /* Clean host part of a prefix. Not necessary in radix tree, | 1013 | /* Clean host part of a prefix. Not necessary in radix tree, |
@@ -2615,6 +2614,8 @@ static int ip6_route_net_init(struct net *net) | |||
2615 | proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops); | 2614 | proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops); |
2616 | proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops); | 2615 | proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops); |
2617 | #endif | 2616 | #endif |
2617 | net->ipv6.ip6_rt_gc_expire = 30*HZ; | ||
2618 | |||
2618 | ret = 0; | 2619 | ret = 0; |
2619 | out: | 2620 | out: |
2620 | return ret; | 2621 | return ret; |