Re: [fixed] [patch] Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <mingo@...>
Cc: <ilpo.jarvinen@...>, <peterz@...>, <linux-kernel@...>, <netdev@...>, <rjw@...>, <akpm@...>, <johnpol@...>, <mcmanus@...>
Date: Wednesday, June 4, 2008 - 2:24 pm

From: Ingo Molnar <mingo@elte.hu>
Date: Wed, 4 Jun 2008 09:23:11 +0200


Ilpo posted another patch which fixes a locking bug in the
code, please test with that patch.  I include it below so
that you know exactly which one I am referring to.

The quicker you test this, the faster I can merge it to
Linus and get the bug fixed for good.

[PATCH] tcp DEFER_ACCEPT: fix racy access to listen_sk

It seems that replacement of DA code also moved parts outside
of appropriate locking. The Ingo's problem seems to come from
the fact that two flows could now race in
(inet_csk_)reqsk_queue_add corrupting the queue. ...This can
leave dangling socks around which won't resolve themselves
without stimuli from outside (e.g., external RST would help
I think).

Then some details I'm not too sure of:
I guess we want to put listen_sk->sk_state checking under the
lock as well. I've not evaluated if ->sk_data_ready too
requires locking but assumed it does.

I'm by no means familiar with all locking variants, requirements,
etc.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
---
 net/ipv4/tcp_input.c |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index c9454f0..d21d2b9 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4562,6 +4562,7 @@ static int tcp_defer_accept_check(struct sock *sk)
 	struct tcp_sock *tp = tcp_sk(sk);
 
 	if (tp->defer_tcp_accept.request) {
+		struct sock *listen_sk = tp->defer_tcp_accept.listen_sk;
 		int queued_data =  tp->rcv_nxt - tp->copied_seq;
 		int hasfin =  !skb_queue_empty(&sk->sk_receive_queue) ?
 			tcp_hdr((struct sk_buff *)
@@ -4570,8 +4571,9 @@ static int tcp_defer_accept_check(struct sock *sk)
 		if (queued_data && hasfin)
 			queued_data--;
 
-		if (queued_data &&
-		    tp->defer_tcp_accept.listen_sk->sk_state == TCP_LISTEN) {
+		bh_lock_sock(listen_sk);
+
+		if (queued_data && listen_sk->sk_state == TCP_LISTEN) {
 			if (sock_flag(sk, SOCK_KEEPOPEN)) {
 				inet_csk_reset_keepalive_timer(sk,
 							       keepalive_time_when(tp));
@@ -4579,23 +4581,24 @@ static int tcp_defer_accept_check(struct sock *sk)
 				inet_csk_delete_keepalive_timer(sk);
 			}
 
-			inet_csk_reqsk_queue_add(
-				tp->defer_tcp_accept.listen_sk,
-				tp->defer_tcp_accept.request,
-				sk);
+			inet_csk_reqsk_queue_add(listen_sk,
+						 tp->defer_tcp_accept.request,
+						 sk);
 
 			tp->defer_tcp_accept.listen_sk->sk_data_ready(
-				tp->defer_tcp_accept.listen_sk, 0);
+						listen_sk, 0);
 
-			sock_put(tp->defer_tcp_accept.listen_sk);
+			sock_put(listen_sk);
 			sock_put(sk);
 			tp->defer_tcp_accept.listen_sk = NULL;
 			tp->defer_tcp_accept.request = NULL;
-		} else if (hasfin ||
-			   tp->defer_tcp_accept.listen_sk->sk_state != TCP_LISTEN) {
+		} else if (hasfin || listen_sk->sk_state != TCP_LISTEN) {
+			bh_unlock_sock(listen_sk);
 			tcp_reset(sk);
 			return -1;
 		}
+
+		bh_unlock_sock(listen_sk);
 	}
 	return 0;
 }
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 7:56 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Thu May 29, 7:14 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 7:46 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 8:18 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 8:58 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Sat May 31, 12:35 pm)
Re: [fixed] [patch] Re: [bug] stuck localhost TCP connection..., David Miller, (Wed Jun 4, 2:24 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Patrick McManus, (Sat May 31, 6:46 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sun Jun 1, 1:51 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Fri May 30, 5:12 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Thu May 29, 9:48 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Evgeniy Polyakov, (Thu May 29, 9:05 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Peter Zijlstra, (Wed May 28, 5:27 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Sat May 31, 10:25 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 12:09 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Sat May 31, 1:58 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 2:37 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Sat May 31, 4:25 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 5:39 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Tue Jun 3, 8:10 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Wed Jun 4, 7:14 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Wed Jun 4, 10:00 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Wed Jun 4, 11:09 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Fri Jun 6, 5:32 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon Jun 9, 3:24 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Tue Jun 10, 7:26 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Wed Jun 11, 9:39 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Wed Jun 18, 8:30 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Håkon Løvdal, (Sat May 31, 5:45 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Sat May 31, 1:22 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Arjan van de Ven, (Mon May 26, 12:24 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 9:28 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 10:12 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 10:58 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 12:23 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 12:32 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 12:54 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 1:08 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 5:20 pm)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 10:17 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ilpo Järvinen, (Mon May 26, 10:43 am)
Re: [bug] stuck localhost TCP connections, v2.6.26-rc3+, Ingo Molnar, (Mon May 26, 10:29 am)