git: fb8588d2cb44 - main - tcp_timewait: use on stack struct tcptw as last resort

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Fri, 19 Nov 2021 04:28:13 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=fb8588d2cb449518a9e8dc75ef34ed2094c68835

commit fb8588d2cb449518a9e8dc75ef34ed2094c68835
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2021-11-19 04:24:46 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2021-11-19 04:27:45 +0000

    tcp_timewait: use on stack struct tcptw as last resort
    
    In case we failed to uma_zalloc() and also failed to reuse with
    tcp_tw_2msl_scan(), then just use on stack tcptw.  This will allow
    to run through tcp_twrespond() and standard tcpcb discard routine.
    
    Reviewed by:            rrs
    Differential revision:  https://reviews.freebsd.org/D32965
---
 sys/netinet/tcp_timewait.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index 9d397d62424f..73a84a407145 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -275,16 +275,17 @@ tcp_twstart(struct tcpcb *tp)
 		 * Reached limit on total number of TIMEWAIT connections
 		 * allowed. Remove a connection from TIMEWAIT queue in LRU
 		 * fashion to make room for this connection.
+		 * If that fails, use on stack tw at least to be able to
+		 * run through tcp_twrespond() and standard tcpcb discard
+		 * routine.
 		 *
 		 * XXX:  Check if it possible to always have enough room
 		 * in advance based on guarantees provided by uma_zalloc().
 		 */
 		tw = tcp_tw_2msl_scan(1);
 		if (tw == NULL) {
-			tp = tcp_close(tp);
-			if (tp != NULL)
-				INP_WUNLOCK(inp);
-			return;
+			tw = &twlocal;
+			local = true;
 		}
 	}
 	/*