svn commit: r228058 - stable/9/sys/netinet
Lawrence Stewart
lstewart at FreeBSD.org
Mon Nov 28 11:10:13 UTC 2011
Author: lstewart
Date: Mon Nov 28 11:10:12 2011
New Revision: 228058
URL: http://svn.freebsd.org/changeset/base/228058
Log:
Fast track MFC r228016:
Plug a TCP reassembly UMA zone leak introduced in r226228 by only using the
backup stack queue entry when the zone is exhausted, otherwise we leak a zone
allocation each time we plug a hole in the reassembly queue.
Reported by: many on freebsd-stable@ (thread: "TCP Reassembly Issues")
Tested by: many on freebsd-stable@ (thread: "TCP Reassembly Issues")
Reviewed by: bz (very brief sanity check)
Approved by: re (kib)
Modified:
stable/9/sys/netinet/tcp_reass.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/netinet/tcp_reass.c
==============================================================================
--- stable/9/sys/netinet/tcp_reass.c Mon Nov 28 10:01:36 2011 (r228057)
+++ stable/9/sys/netinet/tcp_reass.c Mon Nov 28 11:10:12 2011 (r228058)
@@ -233,23 +233,28 @@ tcp_reass(struct tcpcb *tp, struct tcphd
* when the zone is exhausted. Otherwise we may get stuck.
*/
te = uma_zalloc(V_tcp_reass_zone, M_NOWAIT);
- if (te == NULL && th->th_seq != tp->rcv_nxt) {
- TCPSTAT_INC(tcps_rcvmemdrop);
- m_freem(m);
- *tlenp = 0;
- if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL, NULL))) {
- log(LOG_DEBUG, "%s; %s: global zone limit reached, "
- "segment dropped\n", s, __func__);
- free(s, M_TCPLOG);
- }
- return (0);
- } else if (th->th_seq == tp->rcv_nxt) {
- bzero(&tqs, sizeof(struct tseg_qent));
- te = &tqs;
- if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL, NULL))) {
- log(LOG_DEBUG, "%s; %s: global zone limit reached, "
- "using stack for missing segment\n", s, __func__);
- free(s, M_TCPLOG);
+ if (te == NULL) {
+ if (th->th_seq != tp->rcv_nxt) {
+ TCPSTAT_INC(tcps_rcvmemdrop);
+ m_freem(m);
+ *tlenp = 0;
+ if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL,
+ NULL))) {
+ log(LOG_DEBUG, "%s; %s: global zone limit "
+ "reached, segment dropped\n", s, __func__);
+ free(s, M_TCPLOG);
+ }
+ return (0);
+ } else {
+ bzero(&tqs, sizeof(struct tseg_qent));
+ te = &tqs;
+ if ((s = tcp_log_addrs(&tp->t_inpcb->inp_inc, th, NULL,
+ NULL))) {
+ log(LOG_DEBUG,
+ "%s; %s: global zone limit reached, using "
+ "stack for missing segment\n", s, __func__);
+ free(s, M_TCPLOG);
+ }
}
}
tp->t_segqlen++;
More information about the svn-src-stable-9
mailing list