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