ipv6: Fix dst_entry refcnt bugs in ip6_tunnel
authorMartin KaFai Lau <kafai@fb.com>
Tue, 15 Sep 2015 21:30:07 +0000 (14:30 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 15 Sep 2015 21:53:05 +0000 (14:53 -0700)
commitcdf3464e6c6bd764277cbbe992cd12da735b92fb
tree53e75a7f94aba7ced57ae7f2b527bce0d463a629
parentf230d1e891ba1da5953460516960894154f265db
ipv6: Fix dst_entry refcnt bugs in ip6_tunnel

Problems in the current dst_entry cache in the ip6_tunnel:

1. ip6_tnl_dst_set is racy.  There is no lock to protect it:
   - One major problem is that the dst refcnt gets messed up. F.e.
     the same dst_cache can be released multiple times and then
     triggering the infamous dst refcnt < 0 warning message.
   - Another issue is the inconsistency between dst_cache and
     dst_cookie.

   It can be reproduced by adding and removing the ip6gre tunnel
   while running a super_netperf TCP_CRR test.

2. ip6_tnl_dst_get does not take the dst refcnt before returning
   the dst.

This patch:
1. Create a percpu dst_entry cache in ip6_tnl
2. Use a spinlock to protect the dst_cache operations
3. ip6_tnl_dst_get always takes the dst refcnt before returning

Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_tunnel.h
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c