PERFORCE change 124798 for review

Kip Macy kmacy at FreeBSD.org
Mon Aug 6 20:29:39 PDT 2007


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

Change 124798 by kmacy at kmacy_home:ethng on 2007/08/07 03:29:22

	Pull in interface updates required for multi-queue support

Affected files ...

.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#2 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#2 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_offload.c#2 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_osdep.h#2 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#2 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/sys/mbufq.h#2 edit
.. //depot/projects/ethng/src/sys/modules/cxgb/Makefile#2 edit

Differences ...

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

@@ -117,8 +117,9 @@
 #else	
 	struct mtx	lock;
 #endif	
-	int		port;
+	int		port_id;
 	uint8_t		hw_addr[ETHER_ADDR_LEN];
+	uint8_t         tx_chan;
 	uint8_t		nqsets;
 	uint8_t         first_qset;
 	struct taskqueue *tq;
@@ -267,6 +268,8 @@
 	bus_dmamap_t	desc_map;
 	bus_dma_tag_t   entry_tag;
 	struct mbuf_head sendq;
+	struct mbuf_ring txq_mr;
+	uint32_t        txq_drops;
 	struct mtx      lock;
 #define TXQ_NAME_LEN  32
 	char            lockbuf[TXQ_NAME_LEN];
@@ -286,6 +289,10 @@
 
 #define SGE_PSTAT_MAX (SGE_PSTATS_LRO_X_STREAMS+1)
 
+#define QS_EXITING              0x1
+#define QS_RUNNING              0x2
+#define QS_BOUND                0x4
+
 struct sge_qset {
 	struct sge_rspq		rspq;
 	struct sge_fl		fl[SGE_RXQ_PER_SET];
@@ -295,6 +302,8 @@
 	uint64_t                port_stats[SGE_PSTAT_MAX];
 	struct port_info        *port;
 	int                     idx; /* qset # */
+	int                     qs_cpuid;
+	int                     qs_flags;
 };
 
 struct sge {
@@ -336,7 +345,8 @@
 	void			*msix_intr_tag[SGE_QSETS];
 	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 */
+	
 	struct filter_info      *filters;
 	
 	/* Tasks */
@@ -466,7 +476,7 @@
 	uint8_t *macaddr = NULL;
 	
 	if (rm->idx == 0)
-		macaddr = rm->port->hw_addr;
+		macaddr = (uint8_t *)rm->port->hw_addr;
 
 	rm->idx++;
 	return (macaddr);
@@ -507,11 +517,12 @@
 void t3b_intr(void *data);
 void t3_intr_msi(void *data);
 void t3_intr_msix(void *data);
-int t3_encap(struct port_info *, struct mbuf **);
+int t3_encap(struct sge_qset *, struct mbuf **);
 
 int t3_sge_init_adapter(adapter_t *);
 int t3_sge_init_port(struct port_info *);
 void t3_sge_deinit_sw(adapter_t *);
+int t3_free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec);
 
 void t3_rx_eth_lro(adapter_t *adap, struct sge_rspq *rq, struct mbuf *m,
     int ethpad, uint32_t rss_hash, uint32_t rss_csum, int lro);

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

@@ -557,7 +557,7 @@
 		sc->port[i].adapter = sc;
 		sc->port[i].nqsets = port_qsets;
 		sc->port[i].first_qset = i*port_qsets;
-		sc->port[i].port = i;
+		sc->port[i].port_id = i;
 		sc->portdev[i] = child;
 		device_set_softc(child, &sc->port[i]);
 	}
@@ -905,7 +905,7 @@
 
 	p = device_get_softc(dev);
 
-	snprintf(buf, sizeof(buf), "Port %d %s", p->port, p->port_type->desc);
+	snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, p->port_type->desc);
 	device_set_desc_copy(dev, buf);
 	return (0);
 }
@@ -950,7 +950,7 @@
 	p = device_get_softc(dev);
 
 	snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
-	    device_get_unit(device_get_parent(dev)), p->port);  	
+	    device_get_unit(device_get_parent(dev)), p->port_id);
 	PORT_LOCK_INIT(p, p->lockbuf);
 
 	/* Allocate an ifnet object and set it up */
@@ -1032,7 +1032,7 @@
 	}	
 
 
-	snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port);
+	snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port_id);
 #ifdef TASKQUEUE_CURRENT
 	/* Create a port for handling TX without starvation */
 	p->tq = taskqueue_create(p->taskqbuf, M_NOWAIT,
@@ -1195,7 +1195,6 @@
 	}
 }
 
-
 /*
  * Interrupt-context handler for external (PHY) interrupts.
  */
@@ -1704,7 +1703,7 @@
 		t3_intr_clear(sc);
 		t3_sge_init_adapter(sc);
 	}
-	setbit(&p->adapter->open_device_map, p->port);
+	setbit(&p->adapter->open_device_map, p->port_id);
 	ADAPTER_UNLOCK(p->adapter);
 
 	if (is_offload(sc) && !ofld_disable) {
@@ -1714,10 +1713,10 @@
 			    "Could not initialize offload capabilities\n");
 	}
 	cxgb_link_start(p);
-	t3_link_changed(sc, p->port);
+	t3_link_changed(sc, p->port_id);
 	ifp->if_baudrate = p->link_config.speed * 1000000;
 	
-	t3_port_intr_enable(sc, p->port);
+	t3_port_intr_enable(sc, p->port_id);
 
 	callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
 	    cxgb_tick, sc);
@@ -1748,13 +1747,13 @@
 	
 	ifp = p->ifp;
 
-	t3_port_intr_disable(p->adapter, p->port);
+	t3_port_intr_disable(p->adapter, p->port_id);
 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
 	p->phy.ops->power_down(&p->phy, 1);
 	t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
 
 	ADAPTER_LOCK(p->adapter);
-	clrbit(&p->adapter->open_device_map, p->port);
+	clrbit(&p->adapter->open_device_map, p->port_id);
 
 	
 	if (p->adapter->open_device_map == 0) {
@@ -1936,10 +1935,10 @@
 				m = m0;
 				m_collapse(m, TX_MAX_SEGS, &m0);
 			} else
-				break;	
+				break;
 		}
 		m = m0;
-		if ((err = t3_encap(p, &m)) != 0)
+		if ((err = t3_encap(qs, &m)) != 0)
 			break;
 		BPF_MTAP(ifp, m);
 	}
@@ -2119,7 +2118,7 @@
 			cxgb_set_rxmode(p);
 			t3_link_start(&p->phy, mac, &p->link_config);
 			t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
-			t3_port_intr_enable(adapter, p->port);
+			t3_port_intr_enable(adapter, p->port_id);
 			p->mac.stats.num_resets++;
 		}
 		PORT_UNLOCK(p);
@@ -2527,7 +2526,7 @@
 	}
 	case CHELSIO_SET_QSET_NUM: {
 		struct ch_reg *edata = (struct ch_reg *)data;
-		unsigned int port_idx = pi->port;
+		unsigned int port_idx = pi->port_id;
 		
 		if (sc->flags & FULL_INIT_DONE)
 			return (EBUSY);

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

@@ -1250,7 +1250,7 @@
 	}
 
 	/* Add new L2T entry */
-	e = t3_l2t_get(tdev, new, ((struct port_info *)new->rt_ifp->if_softc)->port);
+	e = t3_l2t_get(tdev, new, ((struct port_info *)new->rt_ifp->if_softc)->port_id);
 	if (!e) {
 		log(LOG_ERR, "%s: couldn't allocate new l2t entry!\n",
 		       __FUNCTION__);

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

@@ -52,6 +52,13 @@
 typedef struct adapter adapter_t;
 struct sge_rspq;
 
+struct mbuf_ring {
+	struct mbuf     **mr_ring;
+	volatile uint32_t mr_cons;
+	volatile uint32_t mr_prod;
+	int               mr_size;
+};
+
 #define PANIC_IF(exp) do {                  \
 	if (exp)                            \
 		panic("BUG: %s", exp);      \
@@ -99,19 +106,28 @@
 
 #define TX_MAX_SIZE                (1 << 16)    /* 64KB                          */
 #define TX_MAX_SEGS                      36     /* maximum supported by card     */
+
 #define TX_MAX_DESC                       4     /* max descriptors per packet    */
 
+
 #define TX_START_MIN_DESC  (TX_MAX_DESC << 2)
 
-#if 0
-#define TX_START_MAX_DESC (TX_ETH_Q_SIZE >> 2)  /* maximum number of descriptors */
-#endif
 
+#ifdef IFNET_MULTIQUEUE
+#define TX_START_MAX_DESC (TX_MAX_DESC << 4)    
+#else
 #define TX_START_MAX_DESC (TX_MAX_DESC << 3)    /* maximum number of descriptors
 						 * call to start used per 	 */
+#endif
 
 #define TX_CLEAN_MAX_DESC (TX_MAX_DESC << 4)    /* maximum tx descriptors
 						 * to clean per iteration        */
+#define TX_WR_SIZE_MAX    11*1024              /* the maximum total size of packets aggregated into a single
+						* TX WR
+						*/
+#define TX_WR_COUNT_MAX         7              /* the maximum total number of packets that can be
+						* aggregated into a single TX WR
+						*/
 
 
 #if defined(__i386__) || defined(__amd64__)
@@ -174,8 +190,6 @@
 #define net_device ifnet
 #define cpu_to_be32            htobe32
 
-
-
 /* Standard PHY definitions */
 #define BMCR_LOOPBACK		BMCR_LOOP
 #define BMCR_ISOLATE		BMCR_ISO

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

@@ -1160,14 +1160,14 @@
 #define TCPPKTHDRSIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + 20 + 20)
 
 int
-t3_encap(struct port_info *p, struct mbuf **m)
+t3_encap(struct sge_qset *qs, struct mbuf **m)
 {
 	adapter_t *sc;
 	struct mbuf *m0;
-	struct sge_qset *qs;
 	struct sge_txq *txq;
 	struct tx_sw_desc *stx;
 	struct txq_state txqs;
+	struct port_info *p;
 	unsigned int nsegs, ndesc, flits, cntrl, mlen;
 	int err, tso_info = 0;
 
@@ -1181,9 +1181,9 @@
 	struct cpl_tx_pkt *cpl;
 	
 	DPRINTF("t3_encap ");
-	m0 = *m;	
+	m0 = *m;
+	p = qs->port;
 	sc = p->adapter;
-	qs = &sc->sge.qs[p->first_qset];
 	txq = &qs->txq[TXQ_ETH];
 	stx = &txq->sdesc[txq->pidx];
 	txd = &txq->desc[txq->pidx];
@@ -1196,7 +1196,7 @@
 	 * XXX handle checksum, TSO, and VLAN here
 	 *	 
 	 */
-	cntrl = V_TXPKT_INTF(p->port);
+	cntrl = V_TXPKT_INTF(p->port_id);
 
 	/*
 	 * XXX need to add VLAN support for 6.x

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

@@ -36,6 +36,7 @@
 	struct mbuf *head;
 	struct mbuf *tail;
 	uint32_t     qlen;
+	uint32_t     qsize;
 	struct mtx   lock;
 };
 
@@ -57,13 +58,28 @@
 	return (l->qlen);
 }
 
+static __inline int
+mbufq_size(struct mbuf_head *l)
+{
+	return (l->qsize);
+}
 
+static __inline int
+mbufq_head_size(struct mbuf_head *l)
+{
+	return (l->head ? l->head->m_pkthdr.len : 0);
+}
+
 static __inline void
 mbufq_tail(struct mbuf_head *l, struct mbuf *m)
 {
 	l->qlen++;
-	l->tail->m_nextpkt = m;
+	if (l->head == NULL)
+		l->head = m;
+	else
+		l->tail->m_nextpkt = m;
 	l->tail = m;
+	l->qsize += m->m_pkthdr.len;
 }
 
 static __inline struct mbuf *
@@ -74,9 +90,12 @@
 	m = l->head;
 	if (m) {
 		if (m == l->tail) 
-			l->tail = NULL;
-		l->head = m->m_nextpkt;
+			l->head = l->tail = NULL;
+		else
+			l->head = m->m_nextpkt;
+		m->m_nextpkt = NULL;
 		l->qlen--;
+		l->qsize -= m->m_pkthdr.len;
 	}
 
 	return (m);

==== //depot/projects/ethng/src/sys/modules/cxgb/Makefile#2 (text+ko) ====

@@ -11,7 +11,11 @@
 SRCS+=	uipc_mvec.c
 
 CFLAGS+= -DCONFIG_CHELSIO_T3_CORE -g -DCONFIG_DEFINED -DDEFAULT_JUMBO -I${CXGB}
-#CFLAGS+= -DINVARIANT_SUPPORT -DINVARIANTS 
+CFLAGS+= -DIFNET_MULTIQUEUE
+CFLAGS+= -DINVARIANT_SUPPORT -DINVARIANTS 
+CFLAGS+= -DWITNESS
+#CFLAGS+= -DDEBUG -DDEBUG_PRINT
+
 
 .if ${MACHINE_ARCH} != "ia64"
 # ld is broken on ia64


More information about the p4-projects mailing list