diff options
author | glebius <glebius@FreeBSD.org> | 2006-09-06 13:56:35 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2006-09-06 13:56:35 +0000 |
commit | d907e70991e5532d54d44116c5a0b2cc5387db64 (patch) | |
tree | 031fd47798744592737db92ae3ba63935183153b /sys/netinet/in_pcb.c | |
parent | 1b7ae73acb536e1260e21e970525999d59fdb060 (diff) | |
download | FreeBSD-src-d907e70991e5532d54d44116c5a0b2cc5387db64.zip FreeBSD-src-d907e70991e5532d54d44116c5a0b2cc5387db64.tar.gz |
o Backout rev. 1.125 of in_pcb.c. It appeared to behave extremely
bad under high load. For example with 40k sockets and 25k tcptw
entries, connect() syscall can run for seconds. Debugging showed
that it iterates the cycle millions times and purges thousands of
tcptw entries at a time.
Besides practical unusability this change is architecturally
wrong. First, in_pcblookup_local() is used in connect() and bind()
syscalls. No stale entries purging shouldn't be done here. Second,
it is a layering violation.
o Return back the tcptw purging cycle to tcp_timer_2msl_tw(),
that was removed in rev. 1.78 by rwatson. The commit log of this
revision tells nothing about the reason cycle was removed. Now
we need this cycle, since major cleaner of stale tcptw structures
is removed.
o Disable probably necessary, but now unused
tcp_twrecycleable() function.
Reviewed by: ru
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r-- | sys/netinet/in_pcb.c | 16 |
1 files changed, 0 insertions, 16 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index ddb9e3c..b117b13 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -903,7 +903,6 @@ in_pcblookup_local(struct inpcbinfo *pcbinfo, struct in_addr laddr, u_int lport_arg, int wild_okay) { struct inpcb *inp; - struct tcptw *tw; #ifdef INET6 int matchwild = 3 + INP_LOOKUP_MAPPED_PCB_COST; #else @@ -949,7 +948,6 @@ in_pcblookup_local(struct inpcbinfo *pcbinfo, struct in_addr laddr, * First see if this local port is in use by looking on the * port hash list. */ - retrylookup: porthash = &pcbinfo->porthashbase[INP_PCBPORTHASH(lport, pcbinfo->porthashmask)]; LIST_FOREACH(phd, porthash, phd_hash) { @@ -982,20 +980,6 @@ in_pcblookup_local(struct inpcbinfo *pcbinfo, struct in_addr laddr, if ((inp->inp_vflag & INP_IPV6) != 0) wildcard += INP_LOOKUP_MAPPED_PCB_COST; #endif - /* - * Clean out old time_wait sockets if they - * are clogging up needed local ports. - */ - if ((inp->inp_vflag & INP_TIMEWAIT) != 0) { - tw = intotw(inp); - if (tw != NULL && - tcp_twrecycleable(tw)) { - INP_LOCK(inp); - tcp_twclose(tw, 0); - match = NULL; - goto retrylookup; - } - } if (inp->inp_faddr.s_addr != INADDR_ANY) wildcard++; if (inp->inp_laddr.s_addr != INADDR_ANY) { |