Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Jul 2016 07:43:54 GMT
From:      vincenzo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305712 - soc2016/vincenzo/head/sys/dev/netmap
Message-ID:  <201607040743.u647hsot050724@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vincenzo
Date: Mon Jul  4 07:43:54 2016
New Revision: 305712
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305712

Log:
   freebsd: ptnet_transmit: add support for multi-queue

Modified:
  soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c

Modified: soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c
==============================================================================
--- soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jul  4 07:43:40 2016	(r305711)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jul  4 07:43:54 2016	(r305712)
@@ -132,6 +132,7 @@
 	struct resource		*msix_mem;
 
 	unsigned int		num_rings;
+	unsigned int		num_tx_rings;
 	struct ptnet_queue	*queues;
 	struct ptnet_queue	*rxqueues;
 	struct ptnet_csb	*csb;
@@ -290,6 +291,7 @@
 	num_tx_rings = bus_read_4(sc->iomem, PTNET_IO_NUM_TX_RINGS);
 	num_rx_rings = bus_read_4(sc->iomem, PTNET_IO_NUM_RX_RINGS);
 	sc->num_rings = num_tx_rings + num_rx_rings;
+	sc->num_tx_rings = num_tx_rings;
 
 	/* Allocate and initialize per-queue data structures. */
 	sc->queues = malloc(sizeof(struct ptnet_queue) * sc->num_rings,
@@ -522,14 +524,11 @@
 {
 	int rid = PCIR_BAR(PTNETMAP_MSIX_PCI_BAR);
 	int nvecs = sc->num_rings;
-	unsigned int num_tx_rings;
 	device_t dev = sc->dev;
 	int err = ENOSPC;
 	int cpu_cur;
 	int i;
 
-	num_tx_rings = bus_read_4(sc->iomem, PTNET_IO_NUM_TX_RINGS);
-
 	if (pci_find_cap(dev, PCIY_MSIX, NULL) != 0)  {
 		device_printf(dev, "Could not find MSI-X capability\n");
 		return (ENXIO);
@@ -572,7 +571,7 @@
 		struct ptnet_queue *pq = sc->queues + i;
 		void (*handler)(void *) = ptnet_tx_intr;
 
-		if (i >= num_tx_rings) {
+		if (i >= sc->num_tx_rings) {
 			handler = ptnet_rx_intr;
 		}
 		err = bus_setup_intr(dev, pq->irq, INTR_TYPE_NET | INTR_MPSAFE,
@@ -598,7 +597,7 @@
 		struct ptnet_queue *pq = sc->queues + i;
 		static void (*handler)(void *context, int pending);
 
-		handler = (i < num_tx_rings) ? ptnet_tx_task : ptnet_rx_task;
+		handler = (i < sc->num_tx_rings) ? ptnet_tx_task : ptnet_rx_task;
 
 		TASK_INIT(&pq->task, 0, handler, pq);
 		pq->taskq = taskqueue_create_fast("ptnet_queue", M_NOWAIT,
@@ -1323,11 +1322,20 @@
 {
 	struct ptnet_softc *sc = ifp->if_softc;
 	struct ptnet_queue *pq;
+	unsigned int queue_idx;
 	int err;
 
 	DBG(device_printf(sc->dev, "transmit %p\n", m));
 
-	pq = sc->queues + 0;
+	/* Get the flow-id if available. */
+	queue_idx = (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) ?
+		    m->m_pkthdr.flowid : curcpu;
+
+	if (unlikely(queue_idx >= sc->num_tx_rings)) {
+		queue_idx %= sc->num_tx_rings;
+	}
+
+	pq = sc->queues + queue_idx;
 
 	err = drbr_enqueue(ifp, pq->bufring, m);
 	if (err) {



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