If the incomplete listen queue for a given socket is full,
drop the oldest entry in the queue. There was a fair bit of discussion as to whether or not the proper action is to drop a random entry in the queue. It's my conclusion that a random drop is better than a head drop, however profiling this section of code (done by John Capo) shows that a head-drop results in a significant performance increase. There are scenarios where a random drop is more appropriate. If I find one in reality, I'll add the random drop code under a conditional. Obtained from: discussions and code done by Vernon Schryver (vjs@sgi.com).
This commit is contained in:
parent
6b0658e42a
commit
dd5375bf7c
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
|
||||
* $Id: tcp_input.c,v 1.47 1996/09/13 18:47:03 pst Exp $
|
||||
* $Id: tcp_input.c,v 1.48 1996/09/13 23:51:41 pst Exp $
|
||||
*/
|
||||
|
||||
#ifndef TUBA_INCLUDE
|
||||
@ -410,11 +410,24 @@ findpcb:
|
||||
#endif
|
||||
if (so->so_options & SO_ACCEPTCONN) {
|
||||
register struct tcpcb *tp0 = tp;
|
||||
so = sonewconn(so, 0);
|
||||
if (so == 0) {
|
||||
tcpstat.tcps_listendrop++;
|
||||
goto drop;
|
||||
struct socket *so2;
|
||||
/*
|
||||
* If the attempt to get onto the socket queue failed,
|
||||
* drop the oldest queue entry and try again.
|
||||
*/
|
||||
so2 = sonewconn(so, 0);
|
||||
if (!so2) {
|
||||
so2 = TAILQ_FIRST(&so->so_incom);
|
||||
if (so2) {
|
||||
tcp_drop(sototcpcb(so2), ETIMEDOUT);
|
||||
so2 = sonewconn(so, 0);
|
||||
}
|
||||
if (!so2) {
|
||||
tcpstat.tcps_listendrop++;
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
so = so2;
|
||||
/*
|
||||
* This is ugly, but ....
|
||||
*
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
|
||||
* $Id: tcp_input.c,v 1.47 1996/09/13 18:47:03 pst Exp $
|
||||
* $Id: tcp_input.c,v 1.48 1996/09/13 23:51:41 pst Exp $
|
||||
*/
|
||||
|
||||
#ifndef TUBA_INCLUDE
|
||||
@ -410,11 +410,24 @@ findpcb:
|
||||
#endif
|
||||
if (so->so_options & SO_ACCEPTCONN) {
|
||||
register struct tcpcb *tp0 = tp;
|
||||
so = sonewconn(so, 0);
|
||||
if (so == 0) {
|
||||
tcpstat.tcps_listendrop++;
|
||||
goto drop;
|
||||
struct socket *so2;
|
||||
/*
|
||||
* If the attempt to get onto the socket queue failed,
|
||||
* drop the oldest queue entry and try again.
|
||||
*/
|
||||
so2 = sonewconn(so, 0);
|
||||
if (!so2) {
|
||||
so2 = TAILQ_FIRST(&so->so_incom);
|
||||
if (so2) {
|
||||
tcp_drop(sototcpcb(so2), ETIMEDOUT);
|
||||
so2 = sonewconn(so, 0);
|
||||
}
|
||||
if (!so2) {
|
||||
tcpstat.tcps_listendrop++;
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
so = so2;
|
||||
/*
|
||||
* This is ugly, but ....
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user