Re: Linux 3.1-rc9
From: Thomas Gleixner <hidden>
Date: 2011-11-03 00:24:48
Also in:
netdev
On Wed, 2 Nov 2011, Eric Dumazet wrote:
On 02/11/2011 20:16, Simon Kirby wrote:quoted
Actually, we have an anti-abuse daemon that injects blackhole routes, so this makes sense. (The daemon was written before ipsets were merged and normal netfilter rules make it fall over under attack.) I'll try with this patch. Thanks!Thanks ! Here is the official submission, please add your 'Tested-by' signature when you can confirm problem goes away. (It did here, when I injected random NULL returns from inet_csk_route_child_sock(), so I am confident this is the problem you hit ) [PATCH] net: add missing bh_unlock_sock() calls Simon Kirby reported lockdep warnings and following messages : [104661.897577] huh, entered softirq 3 NET_RX ffffffff81613740 preempt_count 00000101, exited with 00000102? [104661.923653] huh, entered softirq 3 NET_RX ffffffff81613740 preempt_count 00000101, exited with 00000102? Problem comes from commit 0e734419 (ipv4: Use inet_csk_route_child_sock() in DCCP and TCP.) If inet_csk_route_child_sock() returns NULL, we should release socket lock before freeing it. Another lock imbalance exists if __inet_inherit_port() returns an error since commit 093d282321da ( tproxy: fix hash locking issue when using port redirection in __inet_inherit_port()) a backport is also needed forquoted
= 2.6.37 kernels.Reported-by: Dimon Kirby <redacted> Signed-off-by: Eric Dumazet <redacted> Tested-by: Eric Dumazet <redacted> CC: Balazs Scheidler <redacted> CC: KOVACS Krisztian <redacted>
Reviewed-by: Thomas Gleixner <redacted> You probably also want: CC: stable@vger.kernel.org Thanks, tglx
quoted hunk ↗ jump to hunk
--- net/dccp/ipv4.c | 1 + net/ipv4/tcp_ipv4.c | 1 + 2 files changed, 2 insertions(+)diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 332639b..90a919a 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c@@ -433,6 +433,7 @@ exit: NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); return NULL; put_and_exit: + bh_unlock_sock(newsk); sock_put(newsk); goto exit; }diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 0ea10ee..683d97a 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c@@ -1510,6 +1510,7 @@ exit: NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); return NULL; put_and_exit: + bh_unlock_sock(newsk); sock_put(newsk); goto exit; }