ipvs: avoid rcu_barrier during netns cleanup
authorJulian Anastasov <ja@ssi.bg>
Wed, 9 Oct 2013 06:24:27 +0000 (09:24 +0300)
committerSimon Horman <horms@verge.net.au>
Tue, 15 Oct 2013 01:36:01 +0000 (10:36 +0900)
commit9e4e948a3edafd2b7f4dc14c395e146ffd0d9611
tree2432d5bc712bc0ed0ab9f978807190d093bcd1d3
parent120c9794a3ee2f9b1548a1b0b252652e3c134f59
ipvs: avoid rcu_barrier during netns cleanup

commit 578bc3ef1e473a ("ipvs: reorganize dest trash") added
rcu_barrier() on cleanup to wait dest users and schedulers
like LBLC and LBLCR to put their last dest reference.
Using rcu_barrier with many namespaces is problematic.

Trying to fix it by freeing dest with kfree_rcu is not
a solution, RCU callbacks can run in parallel and execution
order is random.

Fix it by creating new function ip_vs_dest_put_and_free()
which is heavier than ip_vs_dest_put(). We will use it just
for schedulers like LBLC, LBLCR that can delay their dest
release.

By default, dests reference is above 0 if they are present in
service and it is 0 when deleted but still in trash list.
Change the dest trash code to use ip_vs_dest_put_and_free(),
so that refcnt -1 can be used for freeing. As result,
such checks remain in slow path and the rcu_barrier() from
netns cleanup can be removed.

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
include/net/ip_vs.h
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/ipvs/ip_vs_lblc.c
net/netfilter/ipvs/ip_vs_lblcr.c