git: a6b982e265fd - main - tcp: move tcp_drain() verbatim before tcp_init()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 17 Aug 2022 18:52:22 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=a6b982e265fd37be58bb3a5c3345a63cecad5b57
commit a6b982e265fd37be58bb3a5c3345a63cecad5b57
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2022-08-17 18:50:31 +0000
Commit: Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2022-08-17 18:50:31 +0000
tcp: move tcp_drain() verbatim before tcp_init()
---
sys/netinet/tcp_subr.c | 102 ++++++++++++++++++++++++-------------------------
1 file changed, 50 insertions(+), 52 deletions(-)
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index e26fe0ec247e..51a2e23db6ef 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1402,6 +1402,56 @@ deregister_tcp_functions(struct tcp_function_block *blk, bool quiesce,
return (0);
}
+static void
+tcp_drain(void)
+{
+ struct epoch_tracker et;
+ VNET_ITERATOR_DECL(vnet_iter);
+
+ if (!do_tcpdrain)
+ return;
+
+ NET_EPOCH_ENTER(et);
+ VNET_LIST_RLOCK_NOSLEEP();
+ VNET_FOREACH(vnet_iter) {
+ CURVNET_SET(vnet_iter);
+ struct inpcb_iterator inpi = INP_ALL_ITERATOR(&V_tcbinfo,
+ INPLOOKUP_WLOCKPCB);
+ struct inpcb *inpb;
+ struct tcpcb *tcpb;
+
+ /*
+ * Walk the tcpbs, if existing, and flush the reassembly queue,
+ * if there is one...
+ * XXX: The "Net/3" implementation doesn't imply that the TCP
+ * reassembly queue should be flushed, but in a situation
+ * where we're really low on mbufs, this is potentially
+ * useful.
+ */
+ while ((inpb = inp_next(&inpi)) != NULL) {
+ if (inpb->inp_flags & INP_TIMEWAIT)
+ continue;
+ if ((tcpb = intotcpcb(inpb)) != NULL) {
+ tcp_reass_flush(tcpb);
+ tcp_clean_sackreport(tcpb);
+#ifdef TCP_BLACKBOX
+ tcp_log_drain(tcpb);
+#endif
+#ifdef TCPPCAP
+ if (tcp_pcap_aggressive_free) {
+ /* Free the TCP PCAP queues. */
+ tcp_pcap_drain(&(tcpb->t_inpkts));
+ tcp_pcap_drain(&(tcpb->t_outpkts));
+ }
+#endif
+ }
+ }
+ CURVNET_RESTORE();
+ }
+ VNET_LIST_RUNLOCK_NOSLEEP();
+ NET_EPOCH_EXIT(et);
+}
+
static void
tcp_vnet_init(void *arg __unused)
{
@@ -1448,8 +1498,6 @@ tcp_vnet_init(void *arg __unused)
VNET_SYSINIT(tcp_vnet_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH,
tcp_vnet_init, NULL);
-static void tcp_drain(void);
-
static void
tcp_init(void *arg __unused)
{
@@ -2517,56 +2565,6 @@ tcp_close(struct tcpcb *tp)
return (tp);
}
-static void
-tcp_drain(void)
-{
- struct epoch_tracker et;
- VNET_ITERATOR_DECL(vnet_iter);
-
- if (!do_tcpdrain)
- return;
-
- NET_EPOCH_ENTER(et);
- VNET_LIST_RLOCK_NOSLEEP();
- VNET_FOREACH(vnet_iter) {
- CURVNET_SET(vnet_iter);
- struct inpcb_iterator inpi = INP_ALL_ITERATOR(&V_tcbinfo,
- INPLOOKUP_WLOCKPCB);
- struct inpcb *inpb;
- struct tcpcb *tcpb;
-
- /*
- * Walk the tcpbs, if existing, and flush the reassembly queue,
- * if there is one...
- * XXX: The "Net/3" implementation doesn't imply that the TCP
- * reassembly queue should be flushed, but in a situation
- * where we're really low on mbufs, this is potentially
- * useful.
- */
- while ((inpb = inp_next(&inpi)) != NULL) {
- if (inpb->inp_flags & INP_TIMEWAIT)
- continue;
- if ((tcpb = intotcpcb(inpb)) != NULL) {
- tcp_reass_flush(tcpb);
- tcp_clean_sackreport(tcpb);
-#ifdef TCP_BLACKBOX
- tcp_log_drain(tcpb);
-#endif
-#ifdef TCPPCAP
- if (tcp_pcap_aggressive_free) {
- /* Free the TCP PCAP queues. */
- tcp_pcap_drain(&(tcpb->t_inpkts));
- tcp_pcap_drain(&(tcpb->t_outpkts));
- }
-#endif
- }
- }
- CURVNET_RESTORE();
- }
- VNET_LIST_RUNLOCK_NOSLEEP();
- NET_EPOCH_EXIT(et);
-}
-
/*
* Notify a tcp user of an asynchronous error;
* store error as soft error, but wake up user