PERFORCE change 125475 for review

Kip Macy kmacy at FreeBSD.org
Mon Aug 20 18:34:50 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=125475

Change 125475 by kmacy at kmacy_home:ethng on 2007/08/21 01:34:19

	- track number of coalesced packets
	- make dequeue_packet and t3_encap take an array of mbufs and return / take a count
	- remove m_sanity call
	- free packet in multi-queue case if we hit ENOMEM

Affected files ...

.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#11 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#13 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#13 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#15 edit

Differences ...

==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#11 (text+ko) ====

@@ -273,6 +273,7 @@
 	struct mbuf_ring txq_mr;
 	uint32_t        txq_drops;
 	uint32_t        txq_skipped;
+	uint32_t        txq_coalesced;
 	unsigned long   txq_frees;
 	struct mtx      lock;
 #define TXQ_NAME_LEN  32
@@ -523,7 +524,7 @@
 void t3b_intr(void *data);
 void t3_intr_msi(void *data);
 void t3_intr_msix(void *data);
-int t3_encap(struct sge_qset *, struct mbuf **);
+int t3_encap(struct sge_qset *, struct mbuf **, int);
 
 int t3_sge_init_adapter(adapter_t *);
 int t3_sge_init_port(struct port_info *);
@@ -590,7 +591,7 @@
 #endif
 
 void t3_free_qset(adapter_t *sc, struct sge_qset *q);
-struct mbuf *cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused);
+int cxgb_dequeue_packet(struct ifnet *, struct sge_txq *, struct mbuf **);
 void cxgb_start(struct ifnet *ifp);
 void refill_fl_service(adapter_t *adap, struct sge_fl *fl);
 

==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#13 (text+ko) ====

@@ -1929,35 +1929,23 @@
 cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax)
 {
 	struct sge_txq *txq;
-	struct mbuf *m0, *m = NULL;
-	int err, in_use_init;
-
+	int err, in_use_init, count, i;
+	struct mbuf *m_vec[TX_WR_COUNT_MAX];
+	
 	txq = &qs->txq[TXQ_ETH];
 	in_use_init = txq->in_use;
 	err = 0;
 	while ((txq->in_use - in_use_init < txmax) &&
 	    (txq->size > txq->in_use + TX_MAX_DESC)) {
-		m = cxgb_dequeue_packet(ifp, txq);
-		if (m == NULL) 
+		count = cxgb_dequeue_packet(ifp, txq, m_vec);
+		if (count == 0) 
 			break;
+#ifdef notyet
 		/*
 		 * Convert chain to M_IOVEC
 		 */
 		KASSERT((m->m_flags & M_IOVEC) == 0, ("IOVEC set too early"));
 		m0 = m;
-#ifdef INVARIANTS
-		/*
-		 * Clean up after net stack sloppiness
-		 * before calling m_sanity
-		 */
-		m0 = m->m_next;
-		while (m0) {
-			m0->m_flags &= ~M_PKTHDR;
-			m0 = m0->m_next;
-		}
-		m_sanity(m0, 0);
-		m0 = m;
-#endif
 		if (collapse_mbufs && m->m_pkthdr.len > MCLBYTES &&
 		    m_collapse(m, TX_MAX_SEGS, &m0) == EFBIG) {
 			if ((m0 = m_defrag(m, M_NOWAIT)) != NULL) {
@@ -1967,9 +1955,11 @@
 				break;
 		}
 		m = m0;
-		if ((err = t3_encap(qs, &m)) != 0)
+#endif		
+		if ((err = t3_encap(qs, m_vec, count)) != 0)
 			break;
-		BPF_MTAP(ifp, m);
+		for (i = 0; i < count; i++)
+			BPF_MTAP(ifp, m_vec[i]);
 	}
 #ifndef IFNET_MULTIQUEUE	
 	if (__predict_false(err)) {
@@ -1993,6 +1983,13 @@
 		err = ENOSPC;
 		setbit(&qs->txq_stopped, TXQ_ETH);
 	}
+	if (err == ENOMEM) {
+		/*
+		 * Sub-optimal :-/
+		 */
+		for (i = 0; i < count; i++)
+			m_freem(m_vec[i]);
+	}
 #endif
 	return (err);
 }
@@ -2048,13 +2045,12 @@
 	} while (error == 0);
 }
 
-struct mbuf *
-cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused)
+int
+cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused, struct mbuf **m_vec)
 {
-	struct mbuf *m;
-
-	IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
-	return (m);
+	
+	IFQ_DRV_DEQUEUE(&ifp->if_snd, m_vec[0]);
+	return (m_vec[0] ? 1 : 0);
 }
 
 void

==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#13 (text+ko) ====

@@ -167,42 +167,40 @@
 	return (err);
 }
 
-struct mbuf *
-cxgb_dequeue_packet(struct ifnet *unused, struct sge_txq *txq)
+int
+cxgb_dequeue_packet(struct ifnet *unused, struct sge_txq *txq, struct mbuf **m_vec)
 {
-	struct mbuf *m, *tail, *head;
+	struct mbuf *m;
 	struct sge_qset *qs;
-	int count, size;
+	int count, size, coalesced;
 	struct mbuf_head *mbq;
 	
 	mbq = &txq->sendq;
-	count = size = 0;
-	tail = NULL;
+	coalesced = count = size = 0;
 
 	qs = txq_to_qset(txq, TXQ_ETH);
 	if (qs->qs_flags & QS_EXITING)
-		return (NULL);
+		return (0);
 
-	for (head = m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) {
+	for (m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) {
 
 		size += m->m_pkthdr.len;
-		count++;
-
-		if (tail) 
-			tail->m_nextpkt = m;
+		m_vec[count++] = m;
 
 		if (count == TX_WR_COUNT_MAX || cxgb_pcpu_tx_coalesce == 0) 
 			break;
-		tail = m;
 		m = mbufq_peek(mbq);
 		/*
 		 * We can't coalesce TSO packets or past 11K 
 		 */
-		if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX)
+		if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL)
 			break;
+
+		coalesced++;
 	}
-
-	return (head);
+	txq->txq_coalesced += coalesced;
+	
+	return (count);
 }
 
 int32_t

==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#15 (text+ko) ====

@@ -1179,7 +1179,7 @@
 #define TCPPKTHDRSIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + 20 + 20)
 
 int
-t3_encap(struct sge_qset *qs, struct mbuf **m)
+t3_encap(struct sge_qset *qs, struct mbuf **m, int count)
 {
 	adapter_t *sc;
 	struct mbuf *m0;


More information about the p4-projects mailing list