ipv6: fix possible seqlock deadlock in ip6_finish_output2
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Fri, 29 Nov 2013 05:39:44 +0000 (06:39 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 19 May 2014 05:54:05 +0000 (07:54 +0200)
[ Upstream commit 7f88c6b23afbd31545c676dea77ba9593a1a14bf ]

IPv6 stats are 64 bits and thus are protected with a seqlock. By not
disabling bottom-half we could deadlock here if we don't disable bh and
a softirq reentrantly updates the same mib.

Cc: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Willy Tarreau <w@1wt.eu>
net/ipv6/ip6_output.c

index bb63ffcd7244e0632aaf43f2ee917866ac6961db..6ff4d07aa209801cc5bbd84da541f40370b5fe88 100644 (file)
@@ -91,8 +91,8 @@ static int ip6_output_finish(struct sk_buff *skb)
        else if (dst->neighbour)
                return dst->neighbour->output(skb);
 
-       IP6_INC_STATS_BH(dev_net(dst->dev),
-                        ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
+       IP6_INC_STATS(dev_net(dst->dev),
+                     ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES);
        kfree_skb(skb);
        return -EINVAL;