Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Aug 2007 00:41:42 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 125472 for review
Message-ID:  <200708210041.l7L0fgdJ015741@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=125472

Change 125472 by kmacy@kmacy_home:ethng on 2007/08/21 00:41:07

	- switch tx software descriptor over to using an mbuf array with a count
	- make dequeue_packet check for TSO so that TSO packets are handled separately
	- change most tx sd local variable names to txsd

Affected files ...

.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#12 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#14 edit

Differences ...

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

@@ -183,23 +183,24 @@
 	if (qs->qs_flags & QS_EXITING)
 		return (NULL);
 
-	critical_enter();
 	for (head = m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) {
 
-		/* XXXX debug */
-		break;
-		
 		size += m->m_pkthdr.len;
 		count++;
 
 		if (tail) 
 			tail->m_nextpkt = m;
 
-		if (count == 7 || size + mbufq_head_size(mbq) > 11*1024 || cxgb_pcpu_tx_coalesce == 0) 
+		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)
+			break;
 	}
-	critical_exit();
 
 	return (head);
 }

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

@@ -133,7 +133,8 @@
 #define RSPQ_SOP_EOP             G_RSPD_SOP_EOP(F_RSPD_SOP|F_RSPD_EOP)
 
 struct tx_sw_desc {                /* SW state per Tx descriptor */
-	struct mbuf	*m;        
+	struct mbuf	*m[TX_WR_COUNT_MAX];
+	int             count;
 	bus_dmamap_t	map;
 	int		flags;
 };
@@ -965,7 +966,7 @@
 
 static unsigned int
 busdma_map_mbufs(struct mbuf **m, struct sge_txq *txq,
-    struct tx_sw_desc *stx, bus_dma_segment_t *segs, int *nsegs)
+    struct tx_sw_desc *txsd, bus_dma_segment_t *segs, int *nsegs)
 {
 	struct mbuf *m0;
 	int err, pktlen;
@@ -973,7 +974,7 @@
 	m0 = *m;
 	pktlen = m0->m_pkthdr.len;
 
-	err = bus_dmamap_load_mvec_sg(txq->entry_tag, stx->map, m0, segs, nsegs, 0);
+	err = bus_dmamap_load_mvec_sg(txq->entry_tag, txsd->map, m0, segs, nsegs, 0);
 #ifdef DEBUG		
 	if (err) {
 		int n = 0;
@@ -995,7 +996,7 @@
 			return (ENOBUFS);
 		}
 		*m = m0;
-		err = bus_dmamap_load_mbuf_sg(txq->entry_tag, stx->map, m0, segs, nsegs, 0);
+		err = bus_dmamap_load_mbuf_sg(txq->entry_tag, txsd->map, m0, segs, nsegs, 0);
 	}
 
 	if (err == ENOMEM) {
@@ -1010,8 +1011,8 @@
 		return (err);
 	}
 
-	bus_dmamap_sync(txq->entry_tag, stx->map, BUS_DMASYNC_PREWRITE);
-	stx->flags |= TX_SW_DESC_MAPPED;
+	bus_dmamap_sync(txq->entry_tag, txsd->map, BUS_DMASYNC_PREWRITE);
+	txsd->flags |= TX_SW_DESC_MAPPED;
 
 	return (0);
 }
@@ -1155,7 +1156,8 @@
 			 * is freed all clusters will be freed
 			 * with it
 			 */
-			txsd->m = NULL;
+			txsd->m[0] = NULL;
+			txsd->count = 0;
 			wrp = (struct work_request_hdr *)txd;
 			wrp->wr_hi = htonl(V_WR_DATATYPE(1) |
 			    V_WR_SGLSFLT(1)) | wr_hi;
@@ -1267,7 +1269,8 @@
 		
 		if (mlen <= WR_LEN - sizeof(*cpl)) {
 			txq_prod(txq, 1, &txqs);
-			txq->sdesc[txqs.pidx].m = m0;
+			txq->sdesc[txqs.pidx].m[0] = m0;
+			txq->sdesc[txqs.pidx].count = 1;
 			m_set_priority(m0, txqs.pidx);
 			
 			if (m0->m_len == m0->m_pkthdr.len)
@@ -1308,7 +1311,8 @@
 	txsd = &txq->sdesc[txqs.pidx];
 	wr_hi = htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl);
 	wr_lo = htonl(V_WR_TID(txq->token));
-	txsd->m = m0;
+	txsd->m[0] = m0;
+	txsd->count = 1;
 	m_set_priority(m0, txqs.pidx); 
 
 	write_wr_hdr_sgl(ndesc, txd, &txqs, txq, sgl, flits, sgl_flits, wr_hi, wr_lo);
@@ -1675,7 +1679,7 @@
 int
 t3_free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec)
 {
-	struct tx_sw_desc *d;
+	struct tx_sw_desc *txsd;
 	unsigned int cidx;
 	int nbufs = 0;
 	
@@ -1684,29 +1688,30 @@
 		  "reclaiming %u Tx descriptors at cidx %u", n, cidx);
 #endif
 	cidx = q->cidx;
-	d = &q->sdesc[cidx];
+	txsd = &q->sdesc[cidx];
 	
 	while (n-- > 0) {
 		DPRINTF("cidx=%d d=%p\n", cidx, d);
-		if (d->m) {
-			if (d->flags & TX_SW_DESC_MAPPED) {
-				bus_dmamap_unload(q->entry_tag, d->map);
-				d->flags &= ~TX_SW_DESC_MAPPED;
+		if (txsd->count > 0) {
+			if (txsd->flags & TX_SW_DESC_MAPPED) {
+				bus_dmamap_unload(q->entry_tag, txsd->map);
+				txsd->flags &= ~TX_SW_DESC_MAPPED;
 			}
-			if (m_get_priority(d->m) == cidx) {
-				m_vec[nbufs] = d->m;
-				d->m = NULL;
+			if (m_get_priority(txsd->m[0]) == cidx) {
+				m_vec[nbufs] = txsd->m[0];
+				txsd->m[0] = NULL;
+				txsd->count = 0;
 				nbufs++;
 			} else {
-				printf("pri=%d cidx=%d\n", (int)m_get_priority(d->m), cidx);
+				printf("pri=%d cidx=%d\n", (int)m_get_priority(txsd->m[0]), cidx);
 			}
 		} else
 			q->txq_skipped++;
 		
-		++d;
+		++txsd;
 		if (++cidx == q->size) {
 			cidx = 0;
-			d = q->sdesc;
+			txsd = q->sdesc;
 		}
 	}
 	q->cidx = cidx;
@@ -1763,7 +1768,8 @@
 	struct txq_state txqs;
 	
 	if (immediate(m)) {
-		q->sdesc[pidx].m = NULL;
+		q->sdesc[pidx].m[0] = NULL;
+		q->sdesc[pidx].count = 0;
 		write_imm(d, m, m->m_len, gen);
 		return;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200708210041.l7L0fgdJ015741>