Date: Fri, 12 Oct 2007 00:20:24 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 127400 for review Message-ID: <200710120020.l9C0KOXl035750@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=127400 Change 127400 by kmacy@kmacy_home:ethng on 2007/10/12 00:19:56 - word align mbuf iovec - move error handling to end of sg collapse routine - allocate a page if there are too many segments to be tracked by a cluster (fixes insta-panics) - when freeing a cluster handle non-standard types Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/sys/mvec.h#10 edit .. //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#14 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/sys/mvec.h#10 (text+ko) ==== @@ -61,6 +61,7 @@ uint16_t mi_rss_hash; /* this can be shrunk down if something comes * along that needs 1 byte */ + uint16_t mi_pad; #define mi_size mi_ext.ext_size #define mi_base mi_ext.ext_buf #define mi_args mi_ext.ext_args @@ -166,7 +167,7 @@ int i; struct mbuf_vec *mv; struct mbuf_iovec *mi; - + mv = mtomv(m); mi = mv->mv_vec; for (i = 0; i < mv->mv_count; i++, mi++) { @@ -180,6 +181,9 @@ case EXT_CLIOVEC: cxgb_cache_put(zone_clust, m); break; + case EXT_JMPIOVEC: + cxgb_cache_put(zone_jumbop, m); + break; default: panic("unexpected type %d\n", type); } @@ -193,6 +197,7 @@ switch (mi->mi_type) { case EXT_IOVEC: case EXT_CLIOVEC: + case EXT_JMPIOVEC: m = (struct mbuf *)mi->mi_base; m_free_iovec(m, mi->mi_type); break; @@ -201,6 +206,11 @@ case EXT_JUMBOP: case EXT_JUMBO9: case EXT_JUMBO16: + case EXT_SFBUF: + case EXT_NET_DRV: + case EXT_MOD_TYPE: + case EXT_DISPOSABLE: + case EXT_EXTREF: mb_free_ext_fast(mi, mi->mi_type, -1); break; default: ==== //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#14 (text+ko) ==== @@ -125,6 +125,8 @@ mi->mi_flags = m->m_flags; mi->mi_len = m->m_len; + + if (m->m_flags & M_PKTHDR) { mi->mi_ether_vtag = m->m_pkthdr.ether_vtag; mi->mi_tso_segsz = m->m_pkthdr.tso_segsz; @@ -133,9 +135,13 @@ if (m->m_type != MT_DATA) { mi->mi_data = NULL; mi->mi_base = (caddr_t)m; + /* + * XXX JMPIOVEC + */ mi->mi_size = (m->m_type == EXT_CLIOVEC) ? MCLBYTES : MIOVBYTES; mi->mi_type = m->m_type; mi->mi_len = m->m_pkthdr.len; + mi->mi_refcnt = NULL; } else if (m->m_flags & M_EXT) { memcpy(&mi->mi_ext, &m->m_ext, sizeof(struct m_ext_)); mi->mi_data = m->m_data; @@ -150,6 +156,9 @@ mi->mi_type = EXT_MBUF; mi->mi_refcnt = NULL; } + KASSERT(mi->mi_len != 0, ("miov has len 0")); + KASSERT(mi->mi_type > 0, ("mi_type is invalid")); + return (n); } @@ -165,7 +174,7 @@ struct mbuf *m0, *n = *m; struct mbuf_iovec *mi; struct mbuf *marray[TX_MAX_SEGS]; - int i, type, seg_count, defragged = 0; + int i, type, seg_count, defragged = 0, err = 0; struct mbuf_vec *mv; if (n->m_flags & M_PKTHDR && !SLIST_EMPTY(&n->m_pkthdr.tags)) @@ -187,7 +196,6 @@ return (ENOMEM); data = m0->m_data; - SLIST_INIT(&n->m_pkthdr.tags); memcpy(m0, n, sizeof(struct m_hdr) + sizeof(struct pkthdr)); m0->m_data = data; m0->m_len = n->m_pkthdr.len; @@ -230,32 +238,42 @@ if (seg_count == 0) { if (cxgb_debug) printf("empty segment chain\n"); - return (EFBIG); + err = EFBIG; + goto err_out; } else if (seg_count >= TX_MAX_SEGS) { if (cxgb_debug) printf("mbuf chain too long: %d max allowed %d\n", seg_count, TX_MAX_SEGS); if (!defragged) { n = m_defrag(*m, M_DONTWAIT); if (n == NULL) { - m_freem(*m); - *m = NULL; - return (ENOBUFS); + err = ENOBUFS; + goto err_out; } *m = n; defragged = 1; goto retry; } - return (EFBIG); + err = EFBIG; + goto err_out; } - - if (seg_count > MAX_MIOVEC_IOV) { + if (seg_count > MAX_CL_IOV) { + if ((m0 = uma_zalloc_arg(zone_jumbop, NULL, M_NOWAIT)) == NULL) { + err = ENOMEM; + goto err_out; + } + type = EXT_JMPIOVEC; + } else if (seg_count > MAX_MIOVEC_IOV) { DPRINTF("seg count=%d ", seg_count); - if ((m0 = uma_zalloc_arg(zone_clust, NULL, M_NOWAIT)) == NULL) - return (ENOMEM); + if ((m0 = uma_zalloc_arg(zone_clust, NULL, M_NOWAIT)) == NULL) { + err = ENOMEM; + goto err_out; + } type = EXT_CLIOVEC; } else { - if ((m0 = uma_zalloc_arg(zone_miovec, NULL, M_NOWAIT)) == NULL) - return (ENOMEM); + if ((m0 = uma_zalloc_arg(zone_miovec, NULL, M_NOWAIT)) == NULL) { + err = ENOMEM; + goto err_out; + } type = EXT_IOVEC; } @@ -281,6 +299,10 @@ *m = m0; DPRINTF("pktlen=%d m0=%p *m=%p m=%p\n", m0->m_pkthdr.len, m0, *m, m); return (0); +err_out: + m_freem(*m); + *m = NULL; + return (err); } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200710120020.l9C0KOXl035750>