diff options
| author | David S. Miller <davem@davemloft.net> | 2016-03-08 23:16:51 +0300 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-03-08 23:16:51 +0300 |
| commit | 8aba8b83128a04197991518e241aafd3323b705d (patch) | |
| tree | b06f18cb9a5fdac6ab626dd9368361fe606a2874 /include | |
| parent | 02daec7c2274c03ac84f1cbe41204ad8f8e3ca6c (diff) | |
| parent | 3dc94f93be161ec4203673de9a34b7362d8985b5 (diff) | |
| download | linux-8aba8b83128a04197991518e241aafd3323b705d.tar.xz | |
Merge branch 'ipv6-per-netns-gc'
Michal Kubecek says:
====================
ipv6: per netns FIB6 walkers and garbage collector
Commit 2ac3ac8f86f2 ("ipv6: prevent fib6_run_gc() contention") reduced
the risk of contention on FIB6 garbage collector lock on systems with
many CPUs. However, one of our customers can still observe heavy
contention on fib6_gc_lock which can even trigger the soft lockup
detector.
This is caused by garbage collector running in forced mode from a timer.
While there is one timer per network namespace, the instances of
fib6_run_gc() running from them are protected by one global spinlock so
that only one garbage collector can run at any moment and other
namespaces have to wait. As most relevant data structures are separated
per netns, there is little reason for garbage collectors blocking each
other.
Similar problem exists for walkers: changes in one tree do not need to
adjust (and block) walkers traversing FIB trees in other namespaces.
This series separates both the walkers infrastructure and garbage
collector so that they work independently in network namespaces.
v2: get rid of ifdef in ipv6_route_seq_setup_walk(), pass net from
callers instead
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/netns/ipv6.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/net/netns/ipv6.h b/include/net/netns/ipv6.h index c0368db6df54..10d0848f5b8a 100644 --- a/include/net/netns/ipv6.h +++ b/include/net/netns/ipv6.h @@ -58,7 +58,10 @@ struct netns_ipv6 { struct timer_list ip6_fib_timer; struct hlist_head *fib_table_hash; struct fib6_table *fib6_main_tbl; + struct list_head fib6_walkers; struct dst_ops ip6_dst_ops; + rwlock_t fib6_walker_lock; + spinlock_t fib6_gc_lock; unsigned int ip6_rt_gc_expire; unsigned long ip6_rt_last_gc; #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
