• Martin KaFai Lau's avatar
    ipv6: Fix dst_entry refcnt bugs in ip6_tunnel · cdf3464e
    Martin KaFai Lau authored
    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: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cdf3464e
ip6_tunnel.c 47.3 KB