PERFORCE change 135929 for review

Kip Macy kmacy at FreeBSD.org
Fri Feb 22 00:29:25 UTC 2008


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

Change 135929 by kmacy at kmacy:entropy:iwarp on 2008/02/22 00:28:30

	we were treating the number of descriptors used as 0 when using TX_MAX_SEGS
	fix

Affected files ...

.. //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#16 edit

Differences ...

==== //depot/projects/iwarp/sys/dev/cxgb/ulp/tom/cxgb_cpl_io.c#16 (text+ko) ====

@@ -117,7 +117,7 @@
  * in the skb and whether it has any payload in its main body.  This maps the
  * length of the gather list represented by an skb into the # of necessary WRs.
  */
-static unsigned int mbuf_wrs[TX_MAX_SEGS] __read_mostly;
+static unsigned int mbuf_wrs[TX_MAX_SEGS + 1] __read_mostly;
 
 /*
  * Max receive window supported by HW in bytes.  Only a small part of it can
@@ -358,10 +358,10 @@
 			KASSERT(!m0->m_next, ("bad append"));
 		} else {
 			while ((mbuf_wrs[count + 1] <= toep->tp_wr_avail)
-			    && (tail != NULL) && (count < TX_MAX_SEGS)) {
+			    && (tail != NULL) && (count < TX_MAX_SEGS-1)) {
 				bytes += tail->m_len;
+				last = tail;
 				count++;
-				last = tail;
 				/*
 				 * technically an abuse to be using this for a VA
 				 * but less gross than defining my own structure
@@ -371,7 +371,6 @@
 				segp->ds_len = tail->m_len;
 				DPRINTF("count=%d wr_needed=%d ds_addr=%p ds_len=%d\n",
 				    count, mbuf_wrs[count], tail->m_data, tail->m_len);
-				
 				segp++;
 				tail = tail->m_next;
 			}
@@ -405,8 +404,6 @@
 			CTR3(KTR_TOM, "t3_push_frames: total_bytes=%d tp_m_last=%p snd_una=0x%08x",
 			    total_bytes, toep->tp_m_last, tp->snd_una);
 
-		toep->tp_wr_avail -= mbuf_wrs[count];
-		toep->tp_wr_unacked += mbuf_wrs[count];
 
 		i = 0;
 		while (i < count && m_get_sgllen(m0)) {
@@ -434,6 +431,9 @@
 		 */
 		m0->m_pkthdr.csum_data = mbuf_wrs[count];
 		m0->m_pkthdr.len = bytes;
+		toep->tp_wr_avail -= mbuf_wrs[count];
+		toep->tp_wr_unacked += mbuf_wrs[count];
+		
 		if ((req_completion && toep->tp_wr_unacked == mbuf_wrs[count]) ||
 		    toep->tp_wr_unacked >= toep->tp_wr_max / 2) {
 			struct work_request_hdr *wr = cplhdr(m0);
@@ -441,7 +441,9 @@
 			wr->wr_hi |= htonl(F_WR_COMPL);
 			toep->tp_wr_unacked = 0;	
 		}
-
+		KASSERT((m0->m_pkthdr.csum_data > 0) &&
+		    (m0->m_pkthdr.csum_data <= 4), ("bad credit count %d",
+			m0->m_pkthdr.csum_data));
 		m0->m_type = MT_DONTFREE;
 		enqueue_wr(toep, m0);
 		DPRINTF("sending offload tx with %d bytes in %d segments\n",
@@ -3736,16 +3738,19 @@
 
 	while (credits) {
 		struct mbuf *p = peek_wr(toep);
-		CTR2(KTR_TOM,
-			"wr_ack: p->credits=%d p->bytes=%d", p->m_pkthdr.csum_data, p->m_pkthdr.len);
 		
 		if (__predict_false(!p)) {
 			log(LOG_ERR, "%u WR_ACK credits for TID %u with "
-			    "nothing pending, state %u\n",
-			       credits, toep->tp_tid, tp->t_state);
+			    "nothing pending, state %u wr_avail=%u\n",
+			    credits, toep->tp_tid, tp->t_state, toep->tp_wr_avail);
 			break;
 		}
+		CTR2(KTR_TOM,
+			"wr_ack: p->credits=%d p->bytes=%d", p->m_pkthdr.csum_data, p->m_pkthdr.len);
+
+		KASSERT(p->m_pkthdr.csum_data != 0, ("empty request still on list"));
 		if (__predict_false(credits < p->m_pkthdr.csum_data)) {
+
 #if DEBUG_WR > 1
 			struct tx_data_wr *w = cplhdr(p);
 			log(LOG_ERR,
@@ -3763,7 +3768,9 @@
 			dequeue_wr(toep);
 			credits -= p->m_pkthdr.csum_data;
 			bytes += p->m_pkthdr.len;
-			DPRINTF("done with wr of %d bytes\n", p->m_pkthdr.len);
+			CTR3(KTR_TOM,
+			    "wr_ack: done with wr of %d bytes remain credits=%d wr credits=%d",
+			    p->m_pkthdr.len, credits, p->m_pkthdr.csum_data);
 	
 			m_free(p);
 		}


More information about the p4-projects mailing list