PERFORCE change 126988 for review

Kip Macy kmacy at FreeBSD.org
Sat Sep 29 12:42:10 PDT 2007


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

Change 126988 by kmacy at kmacy_home:ethng on 2007/09/29 19:41:32

	fix up coalesce handling for mbuf_iovecs 
	- toggling deferred transmit when tx ring is > half full

Affected files ...

.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#21 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#22 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#21 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#27 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#9 edit

Differences ...

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

@@ -365,6 +365,13 @@
 	uint8_t                 rxpkt_map[8]; /* maps RX_PKT interface values to port ids */
 	uint8_t                 rrss_map[SGE_QSETS]; /* revers RSS map table */
 	uint16_t                rspq_map[RSS_TABLE_SIZE];     /* maps 7-bit cookie to qidx */
+	union {
+		uint8_t                 fill[SGE_QSETS];
+		uint64_t                coalesce;
+	} u;
+
+#define tunq_fill u.fill
+#define tunq_coalesce u.coalesce
 	
 	struct filter_info      *filters;
 	

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

@@ -283,7 +283,22 @@
 
 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
 
-static inline char
+static __inline void
+check_pkt_coalesce(struct sge_qset *qs)
+{
+	struct adapter *sc;
+	struct sge_txq *txq;
+
+	txq = &qs->txq[TXQ_ETH];
+	sc = qs->port->adapter;
+
+	if (sc->tunq_fill[qs->idx] && (txq->in_use < (txq->size>>1))) 
+		sc->tunq_fill[qs->idx] = 0;
+	else if (!sc->tunq_fill[qs->idx] && (txq->in_use > (txq->size>>1))) 
+		sc->tunq_fill[qs->idx] = 1;
+}
+
+static __inline char
 t3rev2char(struct adapter *adapter)
 {
 	char rev = 'z';
@@ -1874,9 +1889,9 @@
 	err = 0;
 	while ((txq->in_use - in_use_init < txmax) &&
 	    (txq->size > txq->in_use + TX_MAX_DESC)) {
+		check_pkt_coalesce(qs);
 		count = cxgb_dequeue_packet(ifp, txq, m_vec);
-
-		if (count == 0) 
+		if (count == 0)
 			break;
 		ETHER_BPF_MTAP(ifp, m_vec[0]);
 		

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

@@ -126,8 +126,7 @@
 		return (ENXIO);
 	}
 	txq = &qs->txq[TXQ_ETH];
-	
-	DPRINTF("enqueueing packet to cpuid=%d\n", qs->qs_cpuid);
+
 	mr = &txq->txq_mr;
 	mtx_lock(&mr->mr_lock);
 	cons = mr->mr_cons;
@@ -175,6 +174,7 @@
 	struct mbuf *m;
 	struct sge_qset *qs;
 	int count, size, coalesced;
+	struct adapter *sc;
 	struct mbuf_ring *mr;
 	
 	mr = &txq->txq_mr;
@@ -185,25 +185,43 @@
 		return (0);
 
 	if (txq->immpkt != NULL) {
+		DPRINTF("immediate packet\n");
 		m_vec[0] = txq->immpkt;
 		txq->immpkt = NULL;
 		return (1);
 	}
-	
-	for (m = mbuf_ring_dequeue(mr); m != NULL; m = mbuf_ring_dequeue(mr)) {
+	sc = qs->port->adapter;
+
+	m = mbuf_ring_dequeue(mr);
+	if (m == NULL)
+		return (0);
+
+	m_vec[0] = m;
+	if (m->m_pkthdr.tso_segsz > 0 || m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL) {
+		DPRINTF("returning 1 packet\n");
+		return (1);
+	}
+	count = 1;
+	size = m->m_pkthdr.len;
+	for (m = mbuf_ring_peek(mr); m != NULL; m = mbuf_ring_peek(mr)) {
+
+		if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL)
+			break;
 
+		mbuf_ring_dequeue(mr);
 		size += m->m_pkthdr.len;
 		m_vec[count++] = m;
 
-		if (count == TX_WR_COUNT_MAX || cxgb_pcpu_tx_coalesce == 0) 
+#ifndef COALESCE_ALWAYS
+		if (count == TX_WR_COUNT_MAX || (sc->tunq_coalesce == 0) || (cxgb_pcpu_tx_coalesce == 0))
 			break;
-		m = mbuf_ring_peek(mr);
+#else
 		/*
-		 * We can't coalesce TSO packets or past 11K 
+		 * XXX testing only
 		 */
-		if (m == NULL || m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL)
+		if (count == TX_WR_COUNT_MAX)
 			break;
-
+#endif		
 		coalesced++;
 	}
 	txq->txq_coalesced += coalesced;
@@ -462,11 +480,13 @@
 	struct port_info *pi;
 	struct sge_qset *qs;
 	struct sge_txq *txq = NULL /* gcc is dumb */;
+	struct adapter *sc;
 	
 	pi = ifp->if_softc;
+	sc = pi->adapter;
 	qs = NULL;
 	qidx = resid = err = cookie = locked = 0;
-
+	
 	if (immpkt && (immpkt->m_pkthdr.rss_hash != 0)) {
 		cookie = immpkt->m_pkthdr.rss_hash;
 		qidx = cxgb_pcpu_cookie_to_qidx(pi, cookie);
@@ -477,7 +497,7 @@
 	
 	txq = &qs->txq[TXQ_ETH];
 
-	if (mtx_trylock(&txq->lock)) {
+	if ((sc->tunq_coalesce == 0) && mtx_trylock(&txq->lock)) {
 		txq->flags |= TXQ_TRANSMITTING;
 		err = cxgb_pcpu_start_(qs, immpkt, FALSE);
 		txq->flags &= ~TXQ_TRANSMITTING;

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

@@ -1334,22 +1334,26 @@
 	if (count > 1) {
 		struct cpl_tx_pkt_batch *cpl_batch = (struct cpl_tx_pkt_batch *)txd;
 		int i, fidx;
-	
+		struct mbuf_iovec *batchmi;
+
+		mv = mtomv(m0);
+		batchmi = mv->mv_vec;
+		
 		wrp = (struct work_request_hdr *)txd;
 
 		flits = count*2 + 1;
 		txq_prod(txq, 1, &txqs);
 
-		for (fidx = 1, i = 0; i < count; i++, mi++, fidx += 2) {
+		for (fidx = 1, i = 0; i < count; i++, batchmi++, fidx += 2) {
 			struct cpl_tx_pkt_batch_entry *cbe = &cpl_batch->pkt_entry[i];
 			
 			cntrl = V_TXPKT_INTF(pi->txpkt_intf);
-			GET_VTAG_MI(cntrl, mi);
+			GET_VTAG_MI(cntrl, batchmi);
 			cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT);
 			cbe->cntrl = htonl(cntrl);
-			cbe->len = htonl(mi->mi_len | 0x80000000);
+			cbe->len = htonl(batchmi->mi_len | 0x80000000);
+			cbe->addr = htobe64(segs[i].ds_addr);
 			txd->flit[fidx] |= htobe64(1 << 24);
-			cbe->addr = htobe64(segs[i].ds_addr);
 		}
 
 		wrp->wr_hi = htonl(F_WR_SOP | F_WR_EOP | V_WR_DATATYPE(1) |
@@ -1359,8 +1363,8 @@
 		    V_WR_GEN(txqs.gen)) | htonl(V_WR_TID(txq->token));
 		/* XXX gen? */
 		wr_gen2(txd, txqs.gen);
-		check_ring_tx_db(sc, txq);		
-
+		check_ring_tx_db(sc, txq);
+		
 		return (0);		
 	} else if (tso_info) {
 		int eth_type;

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

@@ -239,10 +239,9 @@
 	}
 	for (i = 0; i < seg_count; i++) {
 		marray[i]->m_next = marray[i]->m_nextpkt = NULL;
-		if (marray[i]->m_flags & M_EXT) {
-			marray[i]->m_flags = 0; 
+		if ((marray[i]->m_flags & (M_EXT|M_NOFREE)) == M_EXT) {
+			marray[i]->m_flags &= ~M_EXT; 
 			m_free(marray[i]);
-
 		}
 	}
 	*nsegs = seg_count;
@@ -268,19 +267,20 @@
 			return (ENOMEM);
 		m0->m_type = EXT_IOVEC;
 	}
-		
+
+	m0->m_flags = 0;
 	mv = mtomv(m0);
 	mv->mv_count = count;
 	mv->mv_first = 0;
-	for (mp = m, i = 0, mi = &mv->mv_vec[0]; i < count; mp++, segs++, mi++, i++) {
+	for (mp = m, i = 0, mi = mv->mv_vec; i < count; mp++, segs++, mi++, i++) {
 		busdma_map_mbuf_fast(*mp, segs);
 		_mcl_collapse_mbuf(mi, *mp);
 	}
 
 	for (mp = m, i = 0; i < count; i++, mp++) {
 		(*mp)->m_next = (*mp)->m_nextpkt = NULL;
-		if ((*mp)->m_flags & M_EXT) {
-			(*mp)->m_flags = 0;
+		if (((*mp)->m_flags & (M_EXT|M_NOFREE)) == M_EXT) {
+			(*mp)->m_flags &= ~M_EXT;
 			m_free(*mp);
 		}
 	}


More information about the p4-projects mailing list