Re: Problem with "tcp: bind() fix when many ports are bound" commit

From: Eric Dumazet
Date: Wed Apr 28 2010 - 13:34:14 EST


Le mercredi 28 avril 2010 Ã 09:50 -0700, David Miller a Ãcrit :
> From: Grzegorz Chwesewicz <grzegorz.chwesewicz@xxxxxxxxxxxx>
> Date: Wed, 28 Apr 2010 14:33:45 +0200
>
> > Hi, I have a problem with binding to port with the latest git kernel
> > (my HEAD is at 1600f9def09de07c5dbeb539e978fa73880690dd). Please CC to
> > me as I'm not subscribed to the list.
>
> Please send networking bug reports CC:'d to netdev and the people
> who wrote and signed off on the commit you've narrowed down the
> problem to.
>
> Otherwise the appropriate people will take longer to find out about
> your bug, and therefore the bug will take longer to fix than
> necessary.
>
> Thanks.
>
> >
> > Example with buggy kernel:
> >
> > ensima-hp ~ # /etc/init.d/apache2 start
> > * Starting apache2 ...
> > (98)Address already in use: make_sock: could not bind to address
> > 127.0.0.1:80
> > no listening sockets available, shutting down
> > Unable to open logs
> >
> > As you can see nothing is listening on port 80, but there are old
> > connections to port 80 with CLOSE_WAIT and FIN_WAIT2 state.
> >
> > ensima-hp ~ # netstat -pan --inet|grep 80
> > netstat: no support for `AF INET (sctp)' on this system.
> > tcp 0 0 127.0.0.1:631 0.0.0.0:*
> > LISTEN 4806/cupsd
> > tcp 1 0 127.0.0.1:54040 127.0.0.1:80
> > CLOSE_WAIT 5814/konquerorHk573
> > tcp 0 0 127.0.0.1:80 127.0.0.1:54042
> > FIN_WAIT2 -
> > tcp 0 0 127.0.0.1:80 127.0.0.1:54040
> > FIN_WAIT2 -
> > tcp 1 0 127.0.0.1:54042 127.0.0.1:80
> > CLOSE_WAIT 6175/konquerordx573
> >
> > So I can't start apache as long as these connections are not fully
> > closed, after that apache starts without problems.
> >
> > ensima-hp ~ # netstat -pan --inet|grep 80
> > netstat: no support for `AF INET (sctp)' on this system.
> > tcp 0 0 127.0.0.1:631 0.0.0.0:*
> > LISTEN 4806/cupsd
> >
> > ensima-hp ~ # /etc/init.d/apache2 start
> > * Starting apache2 ... [OK]
> >
> > Problem occured between 2.6.34-rc4 and latest git, bisect shows that the
> > problem is caused by:
> >
> > commit fda48a0d7a8412cedacda46a9c0bf8ef9cd13559
> > Author: Eric Dumazet <eric.dumazet@xxxxxxxxx>
> > Date: Wed Apr 21 09:26:15 2010 +0000


Oh well...

I am going to test following patch in a couple of hours (I have to
run ...)

Always allowing a reuse LISTEN if no other listener is already active on
same IP.

diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index 78cbc39..e2076dd 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -78,6 +78,7 @@ int inet_csk_bind_conflict(const struct sock *sk,
sk2_rcv_saddr == sk_rcv_saddr)
break;
} else if (reuse && sk2->sk_reuse &&
+ sk->sk_state != TCP_LISTEN &&
sk2_rcv_saddr &&
sk2_rcv_saddr == sk_rcv_saddr)
break;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/