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

Kip Macy kmacy at FreeBSD.org
Wed Jun 3 23:28:23 UTC 2009


Author: kmacy
Date: Wed Jun  3 23:28:22 2009
New Revision: 193412
URL: http://svn.freebsd.org/changeset/base/193412

Log:
  - reclaim in transmit path
  - remove txq lock in faver qset lock

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

Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h	Wed Jun  3 23:27:34 2009	(r193411)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h	Wed Jun  3 23:28:22 2009	(r193412)
@@ -232,7 +232,6 @@ struct sge_txq {
 	bus_addr_t	phys_addr;
 	struct task     qresume_task;
 	struct task     qreclaim_task;
-	struct port_info *port;
 	uint32_t	cntxt_id;
 	uint64_t	stops;
 	uint64_t	restarts;
@@ -250,10 +249,7 @@ struct sge_txq {
 	uint32_t	txq_dump_start;
 	uint32_t	txq_dump_count;
 	unsigned long   txq_frees;
-	struct mtx      lock;
 	struct sg_ent  txq_sgl[TX_MAX_SEGS / 2 + 1];
-	#define TXQ_NAME_LEN  32
-	char            lockbuf[TXQ_NAME_LEN];
 };
      	
 
@@ -284,7 +280,7 @@ struct sge_qset {
 	int                     idx; /* qset # */
 	int                     qs_flags;
 	struct cv		qs_cv;
-	struct mtx		qs_mtx;
+	struct mtx		lock;
 #define QS_NAME_LEN 32
 	char                    namebuf[QS_NAME_LEN];
 };

Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c	Wed Jun  3 23:27:34 2009	(r193411)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c	Wed Jun  3 23:28:22 2009	(r193412)
@@ -677,11 +677,12 @@ cxgb_free(struct adapter *sc)
 		    sc->msix_regs_res);
 	}
 
+	t3_free_sge_resources(sc);
 	t3_sge_deinit_sw(sc);
+
 	/*
 	 * Wait for last callout
 	 */
-	
 	DELAY(hz*100);
 
 	for (i = 0; i < (sc)->params.nports; ++i) {

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	Wed Jun  3 23:27:34 2009	(r193411)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c	Wed Jun  3 23:28:22 2009	(r193412)
@@ -198,10 +198,10 @@ static uint8_t flit_desc_map[] = {
 #endif
 };
 
-#define	TXQ_LOCK_ASSERT(qs)	mtx_assert(&(qs)->txq[TXQ_ETH].lock, MA_OWNED)
-#define	TXQ_TRYLOCK(qs)		mtx_trylock(&(qs)->txq[TXQ_ETH].lock)	
-#define	TXQ_LOCK(qs)		mtx_lock(&(qs)->txq[TXQ_ETH].lock)	
-#define	TXQ_UNLOCK(qs)		mtx_unlock(&(qs)->txq[TXQ_ETH].lock)	
+#define	TXQ_LOCK_ASSERT(qs)	mtx_assert(&(qs)->lock, MA_OWNED)
+#define	TXQ_TRYLOCK(qs)		mtx_trylock(&(qs)->lock)	
+#define	TXQ_LOCK(qs)		mtx_lock(&(qs)->lock)	
+#define	TXQ_UNLOCK(qs)		mtx_unlock(&(qs)->lock)	
 #define	TXQ_RING_EMPTY(qs)	drbr_empty((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr)
 #define	TXQ_RING_DEQUEUE(qs)	drbr_dequeue((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr)
 #define	CXGB_TX_TIMEOUT		5
@@ -222,19 +222,24 @@ static void sge_txq_reclaim_handler(void
  *	queue's lock held.
  */
 static __inline int
-reclaim_completed_tx_(struct sge_txq *q, int reclaim_min)
+reclaim_completed_tx(struct sge_qset *qs, int reclaim_min, int queue)
 {
+	struct sge_txq *q = &qs->txq[queue];
+      
 	int reclaim = desc_reclaimable(q);
 
 	if (reclaim < reclaim_min)
 		return (0);
 	
-	mtx_assert(&q->lock, MA_OWNED);
+	mtx_assert(&qs->lock, MA_OWNED);
 	if (reclaim > 0) {
 		t3_free_tx_desc(q, reclaim);
 		q->cleaned += reclaim;
 		q->in_use -= reclaim;
-	} 
+	}
+	if (isset(&qs->txq_stopped, TXQ_ETH))
+                clrbit(&qs->txq_stopped, TXQ_ETH);
+
 	return (reclaim);
 }
 
@@ -872,13 +877,7 @@ static __inline void
 sge_txq_reclaim_(struct sge_txq *txq, int force)
 {
 
-	if (desc_reclaimable(txq) < 16)
-		return;
-	if (mtx_trylock(&txq->lock) == 0) 
-		return;
-	reclaim_completed_tx_(txq, 16);
-	mtx_unlock(&txq->lock);
-
+	panic("unimplemented");
 }
 
 static void
@@ -1284,8 +1283,7 @@ t3_encap(struct sge_qset *qs, struct mbu
 		tso_info = V_LSO_MSS(m0->m_pkthdr.tso_segsz);
 #endif
 	if (count > 1) {
-		if ((err = busdma_map_sg_vec(m, segs, count)))
-			return (err);
+		busdma_map_sg_vec(m, segs, count);
 		nsegs = count;
 	} else if ((err = busdma_map_sg_collapse(&m0, segs, &nsegs))) {
 		if (cxgb_debug)
@@ -1509,6 +1507,8 @@ cxgb_transmit_locked(struct ifnet *ifp, 
 	int error, count = 1;
 
 	TXQ_LOCK_ASSERT(qs);
+	reclaim_completed_tx(qs, (TX_ETH_Q_SIZE>>3), TXQ_ETH);
+
 	if ((!pi->link_config.link_ok) /* check others */) {
 		error = drbr_enqueue(ifp, br, m);
 		return (error);
@@ -1719,11 +1719,12 @@ immediate(const struct mbuf *m)
  *	descriptor and have no page fragments.
  */
 static int
-ctrl_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m)
+ctrl_xmit(adapter_t *adap, struct sge_qset *qs, struct mbuf *m)
 {
 	int ret;
 	struct work_request_hdr *wrp = mtod(m, struct work_request_hdr *);
-
+	struct sge_txq *q = &qs->txq[TXQ_CTRL];
+	
 	if (__predict_false(!immediate(m))) {
 		m_freem(m);
 		return 0;
@@ -1732,13 +1733,13 @@ ctrl_xmit(adapter_t *adap, struct sge_tx
 	wrp->wrh_hi |= htonl(F_WR_SOP | F_WR_EOP);
 	wrp->wrh_lo = htonl(V_WR_TID(q->token));
 
-	mtx_lock(&q->lock);
+	TXQ_LOCK(qs);
 again:	reclaim_completed_tx_imm(q);
 
 	ret = check_desc_avail(adap, q, m, 1, TXQ_CTRL);
 	if (__predict_false(ret)) {
 		if (ret == 1) {
-			mtx_unlock(&q->lock);
+			TXQ_UNLOCK(qs);
 			log(LOG_ERR, "no desc available\n");
 			return (ENOSPC);
 		}
@@ -1751,8 +1752,7 @@ again:	reclaim_completed_tx_imm(q);
 		q->pidx = 0;
 		q->gen ^= 1;
 	}
-	mtx_unlock(&q->lock);
-	wmb();
+	TXQ_UNLOCK(qs);
 	t3_write_reg(adap, A_SG_KDOORBELL,
 		     F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
 	return (0);
@@ -1775,7 +1775,7 @@ restart_ctrlq(void *data, int npending)
 
 	log(LOG_WARNING, "Restart_ctrlq in_use=%d\n", q->in_use);
 	
-	mtx_lock(&q->lock);
+	TXQ_LOCK(qs);
 again:	reclaim_completed_tx_imm(q);
 
 	while (q->in_use < q->size &&
@@ -1791,15 +1791,13 @@ again:	reclaim_completed_tx_imm(q);
 	}
 	if (!mbufq_empty(&q->sendq)) {
 		setbit(&qs->txq_stopped, TXQ_CTRL);
-		smp_mb();
 
 		if (should_restart_tx(q) &&
 		    test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped))
 			goto again;
 		q->stops++;
 	}
-	mtx_unlock(&q->lock);
-	wmb();
+	TXQ_UNLOCK(qs);
 	t3_write_reg(adap, A_SG_KDOORBELL,
 		     F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
 }
@@ -1811,7 +1809,7 @@ again:	reclaim_completed_tx_imm(q);
 int
 t3_mgmt_tx(struct adapter *adap, struct mbuf *m)
 {
-	return ctrl_xmit(adap, &adap->sge.qs[0].txq[TXQ_CTRL], m);
+	return ctrl_xmit(adap, &adap->sge.qs[0], m);
 }
 
 
@@ -1857,6 +1855,7 @@ t3_free_qset(adapter_t *sc, struct sge_q
 		}
 	}
 
+	MTX_DESTROY(&q->lock);
 	for (i = 0; i < SGE_TXQ_PER_SET; i++) {
 		if (q->txq[i].desc) {
 			mtx_lock_spin(&sc->sge.reg_lock);
@@ -1868,7 +1867,6 @@ t3_free_qset(adapter_t *sc, struct sge_q
 					q->txq[i].desc_map);
 			bus_dma_tag_destroy(q->txq[i].desc_tag);
 			bus_dma_tag_destroy(q->txq[i].entry_tag);
-			MTX_DESTROY(&q->txq[i].lock);
 		}
 		if (q->txq[i].sdesc) {
 			free(q->txq[i].sdesc, M_DEVBUF);
@@ -1905,9 +1903,6 @@ t3_free_sge_resources(adapter_t *sc)
 {
 	int i, nqsets;
 	
-#ifdef IFNET_MULTIQUEUE
-	panic("%s should not be called when IFNET_MULTIQUEUE is defined", __FUNCTION__);
-#endif		
 	for (nqsets = i = 0; i < (sc)->params.nports; i++) 
 		nqsets += sc->port[i].nqsets;
 
@@ -2146,11 +2141,12 @@ calc_tx_descs_ofld(struct mbuf *m, unsig
  *	Send an offload packet through an SGE offload queue.
  */
 static int
-ofld_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m)
+ofld_xmit(adapter_t *adap, struct sge_qset *qs, struct mbuf *m)
 {
 	int ret, nsegs;
 	unsigned int ndesc;
 	unsigned int pidx, gen;
+	struct sge_txq *q = &qs->txq[TXQ_OFLD];
 	bus_dma_segment_t segs[TX_MAX_SEGS], *vsegs;
 	struct tx_sw_desc *stx;
 
@@ -2162,15 +2158,15 @@ ofld_xmit(adapter_t *adap, struct sge_tx
 	stx = &q->sdesc[q->pidx];
 	KASSERT(stx->mi.mi_base == NULL, ("mi_base set"));
 	
-	mtx_lock(&q->lock);
-again:	reclaim_completed_tx_(q, 16);
+	TXQ_LOCK(qs);
+again:	reclaim_completed_tx(qs, 16, TXQ_OFLD);
 	ret = check_desc_avail(adap, q, m, ndesc, TXQ_OFLD);
 	if (__predict_false(ret)) {
 		if (ret == 1) {
 			printf("no ofld desc avail\n");
 			
 			m_set_priority(m, ndesc);     /* save for restart */
-			mtx_unlock(&q->lock);
+			TXQ_UNLOCK(qs);
 			return (EINTR);
 		}
 		goto again;
@@ -2190,7 +2186,7 @@ again:	reclaim_completed_tx_(q, 16);
 		  ndesc, pidx, skb->len, skb->len - skb->data_len,
 		  skb_shinfo(skb)->nr_frags);
 #endif
-	mtx_unlock(&q->lock);
+	TXQ_UNLOCK(qs);
 
 	write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs);
 	check_ring_tx_db(adap, q);
@@ -2214,8 +2210,8 @@ restart_offloadq(void *data, int npendin
 	struct tx_sw_desc *stx = &q->sdesc[q->pidx];
 	int nsegs, cleaned;
 		
-	mtx_lock(&q->lock);
-again:	cleaned = reclaim_completed_tx_(q, 16);
+	TXQ_LOCK(qs);
+again:	cleaned = reclaim_completed_tx(qs, 16, TXQ_OFLD);
 
 	while ((m = mbufq_peek(&q->sendq)) != NULL) {
 		unsigned int gen, pidx;
@@ -2243,16 +2239,15 @@ again:	cleaned = reclaim_completed_tx_(q
 		
 		(void)mbufq_dequeue(&q->sendq);
 		busdma_map_mbufs(&m, q, stx, segs, &nsegs);
-		mtx_unlock(&q->lock);
+		TXQ_UNLOCK(qs);
 		write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs);
-		mtx_lock(&q->lock);
+		TXQ_LOCK(qs);
 	}
-	mtx_unlock(&q->lock);
-	
 #if USE_GTS
 	set_bit(TXQ_RUNNING, &q->flags);
 	set_bit(TXQ_LAST_PKT_DB, &q->flags);
 #endif
+	TXQ_UNLOCK(qs);
 	wmb();
 	t3_write_reg(adap, A_SG_KDOORBELL,
 		     F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
@@ -2300,9 +2295,9 @@ t3_offload_tx(struct t3cdev *tdev, struc
 	struct sge_qset *qs = &adap->sge.qs[queue_set(m)];
 
 	if (__predict_false(is_ctrl_pkt(m))) 
-		return ctrl_xmit(adap, &qs->txq[TXQ_CTRL], m);
+		return ctrl_xmit(adap, qs, m);
 
-	return ofld_xmit(adap, &qs->txq[TXQ_OFLD], m);
+	return ofld_xmit(adap, qs, m);
 }
 
 /**
@@ -2394,7 +2389,7 @@ t3_sge_alloc_qset(adapter_t *sc, u_int i
 	for (i = 0; i < SGE_TXQ_PER_SET; i++) {
 		
 		if ((q->txq[i].txq_mr = buf_ring_alloc(cxgb_txq_buf_ring_size,
-			    M_DEVBUF, M_WAITOK, &q->txq[i].lock)) == NULL) {
+			    M_DEVBUF, M_WAITOK, &q->lock)) == NULL) {
 			device_printf(sc->dev, "failed to allocate mbuf ring\n");
 			goto err;
 		}
@@ -2454,12 +2449,9 @@ t3_sge_alloc_qset(adapter_t *sc, u_int i
 		mbufq_init(&q->txq[i].sendq);
 		q->txq[i].gen = 1;
 		q->txq[i].size = p->txq_size[i];
-		snprintf(q->txq[i].lockbuf, TXQ_NAME_LEN, "t3 txq lock %d:%d:%d",
-		    device_get_unit(sc->dev), irq_vec_idx, i);
-		MTX_INIT(&q->txq[i].lock, q->txq[i].lockbuf, NULL, MTX_DEF);
 	}
-
-	q->txq[TXQ_ETH].port = pi;
+	MTX_INIT(&q->lock, q->namebuf, NULL, MTX_DEF);
+	q->port = pi;
 	
 	TASK_INIT(&q->txq[TXQ_OFLD].qresume_task, 0, restart_offloadq, q);
 	TASK_INIT(&q->txq[TXQ_CTRL].qresume_task, 0, restart_ctrlq, q);
@@ -3050,11 +3042,8 @@ t3_intr_msix(void *data)
 	struct sge_qset *qs = data;
 	adapter_t *adap = qs->port->adapter;
 	struct sge_rspq *rspq = &qs->rspq;
-#ifndef IFNET_MULTIQUEUE
+
 	mtx_lock(&rspq->lock);
-#else	
-	if (mtx_trylock(&rspq->lock)) 
-#endif
 	{
 		
 		if (process_responses_gts(adap, rspq) == 0)


More information about the svn-src-user mailing list