Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Apr 2015 15:00:45 +0000 (UTC)
From:      Sean Bruno <sbruno@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282147 - in projects/em_mq: share/man/man4 sys/dev/e1000 sys/dev/netmap
Message-ID:  <201504281500.t3SF0jGp028459@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sbruno
Date: Tue Apr 28 15:00:45 2015
New Revision: 282147
URL: https://svnweb.freebsd.org/changeset/base/282147

Log:
  No need to break up the rx/tx num queue configuration anymore.

Modified:
  projects/em_mq/share/man/man4/em.4
  projects/em_mq/sys/dev/e1000/if_em.c
  projects/em_mq/sys/dev/e1000/if_em.h
  projects/em_mq/sys/dev/netmap/if_em_netmap.h

Modified: projects/em_mq/share/man/man4/em.4
==============================================================================
--- projects/em_mq/share/man/man4/em.4	Tue Apr 28 14:14:06 2015	(r282146)
+++ projects/em_mq/share/man/man4/em.4	Tue Apr 28 15:00:45 2015	(r282147)
@@ -244,8 +244,7 @@ If
 .Va hw.em.tx_int_delay
 is non-zero, this tunable limits the maximum delay in which a transmit
 interrupt is generated.
-.It Va hw.em.num_rx_queues
-.It Va hw.em.num_tx_queues
+.It Va hw.em.num_queues
 Number of h/w queues that we will run on this adapter. Max 2. Defaults to 1.
 Only valid with kernel configuration
 .Cd "options EM_MULTIQUEUE".

Modified: projects/em_mq/sys/dev/e1000/if_em.c
==============================================================================
--- projects/em_mq/sys/dev/e1000/if_em.c	Tue Apr 28 14:14:06 2015	(r282146)
+++ projects/em_mq/sys/dev/e1000/if_em.c	Tue Apr 28 15:00:45 2015	(r282147)
@@ -400,13 +400,9 @@ SYSCTL_INT(_hw_em, OID_AUTO, enable_msix
     "Enable MSI-X interrupts");
 
 #ifdef EM_MULTIQUEUE
-static int em_num_tx_queues = 1;
-SYSCTL_INT(_hw_em, OID_AUTO, num_tx_queues, CTLFLAG_RDTUN, &em_num_tx_queues, 0,
-    "82574 only: Number of tx queues to configure, 0 indicates autoconfigure");
-
-static int em_num_rx_queues = 1;
-SYSCTL_INT(_hw_em, OID_AUTO, num_rx_queues, CTLFLAG_RDTUN, &em_num_rx_queues, 0,
-    "82574 only: Number of rx queues to configure, 0 indicates autoconfigure");
+static int em_num_queues = 1;
+SYSCTL_INT(_hw_em, OID_AUTO, num_queues, CTLFLAG_RDTUN, &em_num_queues, 0,
+    "82574 only: Number of queues to configure, 0 indicates autoconfigure");
 #endif
 
 /*
@@ -909,7 +905,7 @@ em_resume(device_t dev)
 
 	if ((if_getflags(ifp) & IFF_UP) &&
 	    (if_getdrvflags(ifp) & IFF_DRV_RUNNING) && adapter->link_active) {
-		for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+		for (int i = 0; i < adapter->num_queues; i++, txr++) {
 			EM_TX_LOCK(txr);
 #ifdef EM_MULTIQUEUE
 			if (!drbr_empty(ifp, txr->br))
@@ -1009,9 +1005,9 @@ em_mq_start(if_t ifp, struct mbuf *m)
 	unsigned int	i, error;
 
 	if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
-		i = m->m_pkthdr.flowid % adapter->num_tx_queues;
+		i = m->m_pkthdr.flowid % adapter->num_queues;
 	else
-		i = curcpu % adapter->num_tx_queues;
+		i = curcpu % adapter->num_queues;
 
 	txr = &adapter->tx_rings[i];
 
@@ -1094,7 +1090,7 @@ em_qflush(if_t ifp)
 	struct tx_ring  *txr = adapter->tx_rings;
 	struct mbuf     *m;
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		EM_TX_LOCK(txr);
 		while ((m = buf_ring_dequeue_sc(txr->br)) != NULL)
 			m_freem(m);
@@ -1719,7 +1715,7 @@ em_handle_link(void *context, int pendin
 	E1000_WRITE_REG(&adapter->hw, E1000_IMS,
 	    EM_MSIX_LINK | E1000_IMS_LSC);
 	if (adapter->link_active) {
-		for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+		for (int i = 0; i < adapter->num_queues; i++, txr++) {
 			EM_TX_LOCK(txr);
 #ifdef EM_MULTIQUEUE
 			if (!drbr_empty(ifp, txr->br))
@@ -2292,7 +2288,7 @@ em_local_timer(void *arg)
 	** can be done without the lock because its RO
 	** and the HUNG state will be static if set.
 	*/
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		if ((txr->queue_status == EM_QUEUE_HUNG) &&
 		    (adapter->pause_frames == 0)) {
 			em_print_debug_info(adapter);
@@ -2387,7 +2383,7 @@ em_update_link_status(struct adapter *ad
 			device_printf(dev, "Link is Down\n");
 		adapter->link_active = 0;
 		/* Link down, disable watchdog */
-		for (int i = 0; i < adapter->num_tx_queues; i++, txr++)
+		for (int i = 0; i < adapter->num_queues; i++, txr++)
 			txr->queue_status = EM_QUEUE_IDLE;
 		if_link_state_change(ifp, LINK_STATE_DOWN);
 	}
@@ -2420,7 +2416,7 @@ em_stop(void *arg)
 	if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING);
 
         /* Unarm watchdog timer. */
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		EM_TX_LOCK(txr);
 		txr->queue_status = EM_QUEUE_IDLE;
 		EM_TX_UNLOCK(txr);
@@ -2564,7 +2560,7 @@ em_allocate_msix(struct adapter *adapter
 	E1000_WRITE_REG(&adapter->hw, E1000_IMC, 0xffffffff);
 
 	/* First set up ring resources */
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxr++, vector++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxr++, vector++) {
 
 		/* RX ring */
 		rid = vector + 1;
@@ -2610,7 +2606,7 @@ em_allocate_msix(struct adapter *adapter
 		em_last_bind_cpu = CPU_NEXT(em_last_bind_cpu);
 	}
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++, vector++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++, vector++) {
 		/* TX ring */
 		rid = vector + 1;
 		txr->res = bus_alloc_resource_any(dev,
@@ -2695,7 +2691,7 @@ em_free_pci_resources(struct adapter *ad
 	/*
 	** Release all the queue interrupt resources:
 	*/
-	for (int i = 0; i < adapter->num_tx_queues; i++) {
+	for (int i = 0; i < adapter->num_queues; i++) {
 		txr = &adapter->tx_rings[i];
 		/* an early abort? */
 		if (txr == NULL)
@@ -2708,9 +2704,7 @@ em_free_pci_resources(struct adapter *ad
 		if (txr->res != NULL)
 			bus_release_resource(dev, SYS_RES_IRQ,
 			    rid, txr->res);
-	}
 
-	for (int i = 0; i < adapter->num_tx_queues; i++) {
 		rxr = &adapter->rx_rings[i];
 		/* an early abort? */
 		if (rxr == NULL)
@@ -2765,8 +2759,7 @@ em_setup_msix(struct adapter *adapter)
 	int val;
 
 	/* Nearly always going to use one queue */
-	adapter->num_rx_queues = 1;
-	adapter->num_tx_queues = 1;
+	adapter->num_queues = 1;
 
 	/*
 	** Try using MSI-X for Hartwell adapters
@@ -2774,9 +2767,8 @@ em_setup_msix(struct adapter *adapter)
 	if ((adapter->hw.mac.type == e1000_82574) &&
 	    (em_enable_msix == TRUE)) {
 #ifdef EM_MULTIQUEUE
-		adapter->num_tx_queues = (em_num_tx_queues == 1) ? 1 : 2;
-		adapter->num_rx_queues = (em_num_rx_queues == 1) ? 1 : 2;
-		if (adapter->num_rx_queues > 1 || adapter->num_tx_queues > 1)
+		adapter->num_queues = (em_num_queues == 1) ? 1 : 2;
+		if (adapter->num_queues > 1)
 			em_enable_vectors_82574(adapter);
 #endif
 		/* Map the MSIX BAR */
@@ -2793,12 +2785,12 @@ em_setup_msix(struct adapter *adapter)
 
 #ifdef EM_MULTIQUEUE
 		/* We need 5 vectors in the multiqueue case */
-		if (adapter->num_rx_queues > 1 || adapter->num_tx_queues > 1) {
+		if (adapter->num_queues > 1 ) {
 			if (val >= 5)
 				val = 5;
 			else {
-				adapter->num_tx_queues = 1;
-				adapter->num_rx_queues = 1;
+				adapter->num_queues = 1;
+				adapter->num_queues = 1;
 				device_printf(adapter->dev,
 				    "Insufficient MSIX vectors for >1 queue, "
 				    "using single queue...\n");
@@ -3219,7 +3211,7 @@ em_allocate_queues(struct adapter *adapt
 	/* Allocate the TX ring struct memory */
 	if (!(adapter->tx_rings =
 	    (struct tx_ring *) malloc(sizeof(struct tx_ring) *
-	    adapter->num_tx_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
+	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
 		device_printf(dev, "Unable to allocate TX ring memory\n");
 		error = ENOMEM;
 		goto fail;
@@ -3228,7 +3220,7 @@ em_allocate_queues(struct adapter *adapt
 	/* Now allocate the RX */
 	if (!(adapter->rx_rings =
 	    (struct rx_ring *) malloc(sizeof(struct rx_ring) *
-	    adapter->num_rx_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
+	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
 		device_printf(dev, "Unable to allocate RX ring memory\n");
 		error = ENOMEM;
 		goto rx_fail;
@@ -3241,7 +3233,7 @@ em_allocate_queues(struct adapter *adapt
 	 * possibility that things fail midcourse and we need to
 	 * undo memory gracefully
 	 */ 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txconf++) {
+	for (int i = 0; i < adapter->num_queues; i++, txconf++) {
 		/* Set up some basics */
 		txr = &adapter->tx_rings[i];
 		txr->adapter = adapter;
@@ -3280,7 +3272,7 @@ em_allocate_queues(struct adapter *adapt
 	 */ 
 	rsize = roundup2(adapter->num_rx_desc *
 	    sizeof(struct e1000_rx_desc), EM_DBA_ALIGN);
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxconf++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
 		rxr = &adapter->rx_rings[i];
 		rxr->adapter = adapter;
 		rxr->me = i;
@@ -3468,7 +3460,7 @@ em_setup_transmit_structures(struct adap
 {
 	struct tx_ring *txr = adapter->tx_rings;
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++)
+	for (int i = 0; i < adapter->num_queues; i++, txr++)
 		em_setup_transmit_ring(txr);
 
 	return;
@@ -3488,7 +3480,7 @@ em_initialize_transmit_unit(struct adapt
 
 	 INIT_DEBUGOUT("em_initialize_transmit_unit: begin");
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		u64 bus_addr = txr->txdma.dma_paddr;
 		/* Base and Len of TX Ring */
 		E1000_WRITE_REG(hw, E1000_TDLEN(i),
@@ -3585,7 +3577,7 @@ em_free_transmit_structures(struct adapt
 {
 	struct tx_ring *txr = adapter->tx_rings;
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		EM_TX_LOCK(txr);
 		em_free_transmit_buffers(txr);
 		em_dma_free(adapter, &txr->txdma);
@@ -4236,7 +4228,7 @@ em_setup_receive_structures(struct adapt
 	struct rx_ring *rxr = adapter->rx_rings;
 	int q;
 
-	for (q = 0; q < adapter->num_rx_queues; q++, rxr++)
+	for (q = 0; q < adapter->num_queues; q++, rxr++)
 		if (em_setup_receive_ring(rxr))
 			goto fail;
 
@@ -4277,7 +4269,7 @@ em_free_receive_structures(struct adapte
 {
 	struct rx_ring *rxr = adapter->rx_rings;
 
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxr++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
 		em_free_receive_buffers(rxr);
 		/* Free the ring memory as well */
 		em_dma_free(adapter, &rxr->rxdma);
@@ -4397,7 +4389,7 @@ em_initialize_receive_unit(struct adapte
 	E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum);
 
 #ifdef EM_MULTIQUEUE
-	if (adapter->num_rx_queues > 1) {
+	if (adapter->num_queues > 1) {
 		uint32_t rss_key[10];
 		uint32_t reta;
 		int i;
@@ -4416,7 +4408,7 @@ em_initialize_receive_unit(struct adapte
 		reta = 0;
 		for (i = 0; i < 4; ++i) {
 			uint32_t q;
-			q = (i % adapter->num_rx_queues) << 7;
+			q = (i % adapter->num_queues) << 7;
 			reta |= q << (8 * i);
 		}
 		for (i = 0; i < 32; ++i)
@@ -4441,7 +4433,7 @@ em_initialize_receive_unit(struct adapte
 	if (hw->mac.type == e1000_82573)
 		E1000_WRITE_REG(hw, E1000_RDTR, 0x20);
 
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxr++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
 		/* Setup the Base and Length of the Rx Descriptor Ring */
 		u32 rdt = adapter->num_rx_desc - 1; /* default */
 
@@ -4480,7 +4472,7 @@ em_initialize_receive_unit(struct adapte
 		E1000_WRITE_REG(hw, E1000_RXDCTL(0), rxdctl | 3);
 	} else if ((adapter->hw.mac.type == e1000_82574) &&
 		  (if_getmtu(ifp) > ETHERMTU)) {
-		for (int i = 0; i < adapter->num_rx_queues; i++) {
+		for (int i = 0; i < adapter->num_queues; i++) {
 			u32 rxdctl = E1000_READ_REG(hw, E1000_RXDCTL(i));
 
                 	rxdctl |= 0x20; /* PTHRESH */
@@ -5467,7 +5459,7 @@ em_add_hw_stats(struct adapter *adapter)
 			CTLFLAG_RD, &adapter->hw.fc.low_water, 0,
 			"Flow Control Low Watermark");
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		snprintf(namebuf, QUEUE_NAME_LEN, "queue_tx_%d", i);
 		queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
 					    CTLFLAG_RD, NULL, "TX Queue Name");
@@ -5490,7 +5482,7 @@ em_add_hw_stats(struct adapter *adapter)
 				CTLFLAG_RD, &txr->no_desc_avail,
 				"Queue No Descriptor Available");
 	}
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxr++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
 		snprintf(namebuf, QUEUE_NAME_LEN, "queue_rx_%d", i);
 		queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf,
 					    CTLFLAG_RD, NULL, "RX Queue Name");
@@ -5929,7 +5921,7 @@ em_print_debug_info(struct adapter *adap
 	else
 		printf("and ACTIVE\n");
 
-	for (int i = 0; i < adapter->num_tx_queues; i++, txr++) {
+	for (int i = 0; i < adapter->num_queues; i++, txr++) {
 		device_printf(dev, "TX Queue %d ------\n", i);
 		device_printf(dev, "hw tdh = %d, hw tdt = %d\n",
 	    		E1000_READ_REG(&adapter->hw, E1000_TDH(i)),
@@ -5940,7 +5932,7 @@ em_print_debug_info(struct adapter *adap
 		device_printf(dev, "Tx Descriptors avail failure = %ld\n",
 	    		txr->no_desc_avail);
 	}
-	for (int i = 0; i < adapter->num_rx_queues; i++, rxr++) {
+	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
 		device_printf(dev, "RX Queue %d ------\n", i);
 		device_printf(dev, "hw rdh = %d, hw rdt = %d\n",
 	    		E1000_READ_REG(&adapter->hw, E1000_RDH(i)),

Modified: projects/em_mq/sys/dev/e1000/if_em.h
==============================================================================
--- projects/em_mq/sys/dev/e1000/if_em.h	Tue Apr 28 14:14:06 2015	(r282146)
+++ projects/em_mq/sys/dev/e1000/if_em.h	Tue Apr 28 15:00:45 2015	(r282147)
@@ -408,8 +408,7 @@ struct adapter {
 
 	u16	num_vlans;
 	/* Allow number of tx queues != num of rx_queues */
-	u8	num_tx_queues;
-	u8	num_rx_queues;
+	u8	num_queues;
 
         /*
          * Transmit rings:

Modified: projects/em_mq/sys/dev/netmap/if_em_netmap.h
==============================================================================
--- projects/em_mq/sys/dev/netmap/if_em_netmap.h	Tue Apr 28 14:14:06 2015	(r282146)
+++ projects/em_mq/sys/dev/netmap/if_em_netmap.h	Tue Apr 28 15:00:45 2015	(r282147)
@@ -48,11 +48,9 @@ em_netmap_block_tasks(struct adapter *ad
 		struct tx_ring *txr = adapter->tx_rings;
 		struct rx_ring *rxr = adapter->rx_rings;
 
-		for (i = 0; i < adapter->num_tx_queues; i++, txr++) {
+		for (i = 0; i < adapter->num_queues; i++, txr++, rxr++) {
 			taskqueue_block(txr->tq);
 			taskqueue_drain(txr->tq, &txr->tx_task);
-		}
-		for (i = 0; i < adapter->num_rx_queues; i++, rxr++) {
 			taskqueue_block(rxr->tq);
 			taskqueue_drain(rxr->tq, &rxr->rx_task);
 		}
@@ -72,10 +70,8 @@ em_netmap_unblock_tasks(struct adapter *
 		struct rx_ring *rxr = adapter->rx_rings;
 		int i;
 
-		for (i = 0; i < adapter->num_tx_queues; i++) {
+		for (i = 0; i < adapter->num_queues; i++, txr++, rxr++) {
 			taskqueue_unblock(txr->tq);
-		}
-		for (i = 0; i < adapter->num_rx_queues; i++) {
 			taskqueue_unblock(rxr->tq);
 		}
 	} else { /* legacy */
@@ -331,8 +327,8 @@ em_netmap_attach(struct adapter *adapter
 	na.nm_txsync = em_netmap_txsync;
 	na.nm_rxsync = em_netmap_rxsync;
 	na.nm_register = em_netmap_reg;
-	na.num_tx_rings = adapter->num_tx_queues;
-	na.num_rx_rings = adapter->num_rx_queues;
+	na.num_tx_rings = adapter->num_queues;
+	na.num_rx_rings = adapter->num_queues;
 	netmap_attach(&na);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504281500.t3SF0jGp028459>