PERFORCE change 127400 for review
Kip Macy
kmacy at FreeBSD.org
Thu Oct 11 17:20:25 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127400
Change 127400 by kmacy at 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
More information about the p4-projects
mailing list