svn commit: r193598 - in user/kmacy/releng_7_2_fcs/sys/dev/cxgb: . sys

Kip Macy kmacy at FreeBSD.org
Sun Jun 7 00:02:53 UTC 2009


Author: kmacy
Date: Sun Jun  7 00:02:52 2009
New Revision: 193598
URL: http://svn.freebsd.org/changeset/base/193598

Log:
  - minimize the number of descriptors that are used by a delayed transmit / watchdog
  - add once per second watchdog

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
  user/kmacy/releng_7_2_fcs/sys/dev/cxgb/sys/mvec.h

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	Sat Jun  6 22:20:41 2009	(r193597)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_adapter.h	Sun Jun  7 00:02:52 2009	(r193598)
@@ -243,6 +243,7 @@ struct sge_txq {
 	struct buf_ring *txq_mr;
 	struct ifaltq	*txq_ifq;
 	struct callout	txq_timer;
+	struct callout	txq_watchdog;
 	uint32_t        txq_drops;
 	uint32_t        txq_skipped;
 	uint32_t        txq_coalesced;
@@ -267,6 +268,7 @@ enum {
 #define QS_EXITING              0x1
 #define QS_RUNNING              0x2
 #define QS_BOUND                0x4
+#define	QS_FLUSHING		0x8
 
 struct sge_qset {
 	struct sge_rspq		rspq;
@@ -562,9 +564,8 @@ static inline int offload_running(adapte
         return isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT);
 }
 
+void cxgb_tx_watchdog(void *arg);
 int cxgb_transmit(struct ifnet *ifp, struct mbuf *m);
 void cxgb_qflush(struct ifnet *ifp);
-int process_responses(adapter_t *adap, struct sge_qset *qs, int budget);
 void cxgb_start(struct ifnet *ifp);
-void refill_fl_service(adapter_t *adap, struct sge_fl *fl);
 #endif

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	Sat Jun  6 22:20:41 2009	(r193597)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c	Sun Jun  7 00:02:52 2009	(r193598)
@@ -1936,7 +1936,7 @@ cxgb_init_locked(struct port_info *p)
 {
 	struct ifnet *ifp;
 	adapter_t *sc = p->adapter;
-	int err;
+	int i, err;
 
 	PORT_LOCK_ASSERT_OWNED(p);
 	ifp = p->ifp;
@@ -1972,11 +1972,18 @@ cxgb_init_locked(struct port_info *p)
 	device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id);
 	t3_port_intr_enable(sc, p->port_id);
 
- 	callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
 	t3_sge_reset_adapter(sc);
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ 	callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
+	for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
+		struct sge_qset *qs = &sc->sge.qs[i];
+		struct sge_txq *txq = &qs->txq[TXQ_ETH];
+
+		callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog,
+		    qs, txq->txq_watchdog.c_cpu);
+	}
 }
 
 static void

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	Sat Jun  6 22:20:41 2009	(r193597)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c	Sun Jun  7 00:02:52 2009	(r193598)
@@ -704,12 +704,6 @@ __refill_fl_lt(adapter_t *adap, struct s
 		refill_fl(adap, fl, min(max, fl->size - fl->credits));
 }
 
-void
-refill_fl_service(adapter_t *adap, struct sge_fl *fl)
-{
-	__refill_fl_lt(adap, fl, 512);
-}
-
 /**
  *	recycle_rx_buf - recycle a receive buffer
  *	@adapter: the adapter
@@ -1327,7 +1321,7 @@ t3_encap(struct sge_qset *qs, struct mbu
 		return (err);
 	} 
 	KASSERT(m0->m_pkthdr.len, ("empty packet nsegs=%d", nsegs));
-	txsd->m = m0;	
+	txsd->m = m0;
 
 	if (m0->m_nextpkt != NULL) {
 		struct cpl_tx_pkt_batch *cpl_batch = (struct cpl_tx_pkt_batch *)txd;
@@ -1491,13 +1485,33 @@ t3_encap(struct sge_qset *qs, struct mbu
 	return (0);
 }
 
+void
+cxgb_tx_watchdog(void *arg)
+{
+	struct sge_qset *qs = arg;
+	struct sge_txq *txq = &qs->txq[TXQ_ETH];
+
+	if (TXQ_TRYLOCK(qs)) {
+		qs->qs_flags |= QS_FLUSHING;
+		cxgb_start_locked(qs);
+		qs->qs_flags &= ~QS_FLUSHING;
+		TXQ_UNLOCK(qs);
+	}
+	if (qs->port->ifp->if_drv_flags & IFF_DRV_RUNNING)
+		callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog,
+		    qs, txq->txq_watchdog.c_cpu);
+}
+
+	
 static void
 cxgb_tx_timeout(void *arg)
 {
 	struct sge_qset *qs = arg;
 
 	if (TXQ_TRYLOCK(qs)) {
+		qs->qs_flags |= QS_FLUSHING;
 		cxgb_start_locked(qs);
+		qs->qs_flags &= ~QS_FLUSHING;
 		TXQ_UNLOCK(qs);
 	}
 }
@@ -1564,6 +1578,10 @@ cxgb_start_locked(struct sge_qset *qs)
 	avail = txq->size - txq->in_use - 4;
 	txmax = min(TX_START_MAX_DESC, avail);
 
+	/* in case all packets use more than one mbuf */
+	if (qs->qs_flags & QS_FLUSHING)
+		txmax = min(txmax, 7); 
+		
 	TXQ_LOCK_ASSERT(qs);
 	while ((txq->in_use - in_use_init < txmax) &&
 	    (!TXQ_RING_EMPTY(qs)) &&
@@ -1620,7 +1638,8 @@ cxgb_transmit_locked(struct ifnet *ifp, 
 	 * - there are no packets enqueued already
 	 * - there is space in hardware transmit queue 
 	 */
-	if (sc->tunq_coalesce == 0 && pi->link_config.link_ok &&
+	if (sc->tunq_coalesce == 0 &&
+	    pi->link_config.link_ok &&
 	    TXQ_RING_EMPTY(qs) && avail > 4) {
 		if (t3_encap(qs, &m)) {
 			if (m != NULL &&
@@ -2501,7 +2520,9 @@ t3_sge_alloc_qset(adapter_t *sc, u_int i
 		}
 		ifq_attach(q->txq[i].txq_ifq, pi->ifp);
 		callout_init(&q->txq[i].txq_timer, 1);
+		callout_init(&q->txq[i].txq_watchdog, 1);
 		q->txq[i].txq_timer.c_cpu = id % mp_ncpus;
+		q->txq[i].txq_watchdog.c_cpu = id % mp_ncpus;
 	}
 	init_qset_cntxt(q, id);
 	q->idx = id;
@@ -2888,7 +2909,7 @@ check_ring_db(adapter_t *adap, struct sg
  *	on this queue.  If the system is under memory shortage use a fairly
  *	long delay to help recovery.
  */
-int
+static int
 process_responses(adapter_t *adap, struct sge_qset *qs, int budget)
 {
 	struct sge_rspq *rspq = &qs->rspq;

Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/sys/mvec.h
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/sys/mvec.h	Sat Jun  6 22:20:41 2009	(r193597)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/sys/mvec.h	Sun Jun  7 00:02:52 2009	(r193598)
@@ -73,9 +73,9 @@ m_freem_list(struct mbuf *m)
 
 	while (m != NULL) {
 #ifdef INVARIANTS
-		if ((m == (struct mbuf *)0xDEADCODE) ||
+		if ((m == (struct mbuf *)0xDEADC0DE) ||
 		    m == (struct mbuf *)0xdeadc0dedeadc0de)
-			panic("freed mbuf %d in mbuf list", i);
+			panic("%s freed mbuf %d in mbuf list", __FUNCTION__, i);
 		i++;
 #endif
 		n = m->m_nextpkt;


More information about the svn-src-user mailing list