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