diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2008-12-30 02:04:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-30 02:04:08 -0500 |
commit | eb4dea5853046727bfbb579f0c9a8cae7369f7c6 (patch) | |
tree | 79e18d6284494ab63a890885b0eecce9431a9597 /net/ipv6/tcp_ipv6.c | |
parent | 0f23174aa8c1aa7a2a6050a72a60d290ef9ee578 (diff) |
net: Fix percpu counters deadlock
When we converted the protocol atomic counters such as the orphan
count and the total socket count deadlocks were introduced due to
the mismatch in BH status of the spots that used the percpu counter
operations.
Based on the diagnosis and patch by Peter Zijlstra, this patch
fixes these issues by disabling BH where we may be in process
context.
Reported-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Tested-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 8702b06cb60a..e8b8337a8310 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -23,6 +23,7 @@ | |||
23 | * 2 of the License, or (at your option) any later version. | 23 | * 2 of the License, or (at your option) any later version. |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/bottom_half.h> | ||
26 | #include <linux/module.h> | 27 | #include <linux/module.h> |
27 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
28 | #include <linux/types.h> | 29 | #include <linux/types.h> |
@@ -1830,7 +1831,9 @@ static int tcp_v6_init_sock(struct sock *sk) | |||
1830 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; | 1831 | sk->sk_sndbuf = sysctl_tcp_wmem[1]; |
1831 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; | 1832 | sk->sk_rcvbuf = sysctl_tcp_rmem[1]; |
1832 | 1833 | ||
1834 | local_bh_disable(); | ||
1833 | percpu_counter_inc(&tcp_sockets_allocated); | 1835 | percpu_counter_inc(&tcp_sockets_allocated); |
1836 | local_bh_enable(); | ||
1834 | 1837 | ||
1835 | return 0; | 1838 | return 0; |
1836 | } | 1839 | } |