svn commit: r193481 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb

Kip Macy kmacy at FreeBSD.org
Fri Jun 5 04:20:15 UTC 2009


Author: kmacy
Date: Fri Jun  5 04:20:14 2009
New Revision: 193481
URL: http://svn.freebsd.org/changeset/base/193481

Log:
  fix prefetching in tx clean and get packet

Modified:
  user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c

Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c	Fri Jun  5 03:06:24 2009	(r193480)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c	Fri Jun  5 04:20:14 2009	(r193481)
@@ -2034,19 +2034,22 @@ void
 t3_free_tx_desc(struct sge_qset *qs, int reclaimable, int queue)
 {
 	struct tx_sw_desc *txsd;
-	unsigned int cidx;
+	unsigned int cidx, mask;
 	struct sge_txq *q = &qs->txq[queue];
-	
+
 #ifdef T3_TRACE
 	T3_TRACE2(sc->tb[q->cntxt_id & 7],
 		  "reclaiming %u Tx descriptors at cidx %u", reclaimable, cidx);
 #endif
 	cidx = q->cidx;
+	mask = q->size - 1;
 	txsd = &q->sdesc[cidx];
-	DPRINTF("reclaiming %d WR\n", reclaimable);
+
 	mtx_assert(&qs->lock, MA_OWNED);
 	while (reclaimable--) {
-		DPRINTF("cidx=%d d=%p\n", cidx, txsd);
+		prefetch(q->sdesc[(cidx + 1) & mask].m);
+		prefetch(q->sdesc[(cidx + 2) & mask].m);
+
 		if (txsd->m != NULL) {
 			if (txsd->flags & TX_SW_DESC_MAPPED) {
 				bus_dmamap_unload(q->entry_tag, txsd->map);
@@ -2688,15 +2691,20 @@ get_packet(adapter_t *adap, unsigned int
 
 	unsigned int len_cq =  ntohl(r->len_cq);
 	struct sge_fl *fl = (len_cq & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
-	struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
+	int mask, cidx = fl->cidx;
+	struct rx_sw_desc *sd = &fl->sdesc[cidx];
 	uint32_t len = G_RSPD_LEN(len_cq);
 	uint32_t flags = M_EXT;
 	uint8_t sopeop = G_RSPD_SOP_EOP(ntohl(r->flags));
 	caddr_t cl;
 	struct mbuf *m;
 	int ret = 0;
-	
-	prefetch(sd->rxsd_cl);
+
+	mask = fl->size - 1;
+	prefetch(fl->sdesc[(cidx + 1) & mask].m);
+	prefetch(fl->sdesc[(cidx + 2) & mask].m);
+	prefetch(fl->sdesc[(cidx + 1) & mask].rxsd_cl);
+	prefetch(fl->sdesc[(cidx + 2) & mask].rxsd_cl);	
 
 	fl->credits--;
 	bus_dmamap_sync(fl->entry_tag, sd->map, BUS_DMASYNC_POSTREAD);
@@ -2935,7 +2943,7 @@ process_responses(adapter_t *adap, struc
 			rspq->gen ^= 1;
 			r = rspq->desc;
 		}
-		prefetch(r);
+
 		if (++rspq->credits >= (rspq->size / 4)) {
 			refill_rspq(adap, rspq, rspq->credits);
 			rspq->credits = 0;
@@ -2955,8 +2963,6 @@ process_responses(adapter_t *adap, struc
 			
 		} else if (eth && eop) {
 			struct mbuf *m = rspq->rspq_mh.mh_head;
-			prefetch(mtod(m, uint8_t *)); 
-			prefetch(mtod(m, uint8_t *) + L1_CACHE_BYTES);
 
 			t3_rx_eth(adap, rspq, m, ethpad);
 


More information about the svn-src-user mailing list