socsvn commit: r306418 - soc2016/vincenzo/head/sys/dev/netmap

vincenzo at FreeBSD.org vincenzo at FreeBSD.org
Mon Jul 18 09:08:47 UTC 2016


Author: vincenzo
Date: Mon Jul 18 09:08:46 2016
New Revision: 306418
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=306418

Log:
   freebsd: ptnet_rx_eof: implement batching scheme

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 18 09:08:16 2016	(r306417)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jul 18 09:08:46 2016	(r306418)
@@ -236,6 +236,7 @@
 
 #define PTNET_BUF_RING_SIZE	4096
 #define PTNET_RX_BUDGET		512
+#define PTNET_RX_BATCH		1
 #define PTNET_TX_BATCH		64
 #define PTNET_HDR_SIZE		sizeof(struct virtio_net_hdr_mrg_rxbuf)
 #define PTNET_MAX_PKT_SIZE	65536
@@ -1751,8 +1752,8 @@
 		m_freem(mhead);
 
 		if (++batch_count == PTNET_TX_BATCH) {
-			batch_count = 0;
 			ptnet_ring_update(pq, kring, head, NAF_FORCE_RECLAIM);
+			batch_count = 0;
 		}
 	}
 
@@ -1872,6 +1873,7 @@
 	unsigned int const lim = kring->nkr_num_slots - 1;
 	unsigned int budget = PTNET_RX_BUDGET;
 	unsigned int head = ring->head;
+	unsigned int batch_count = 0;
 	struct ifnet *ifp = sc->ifp;
 
 	PTNET_Q_LOCK(pq);
@@ -2025,21 +2027,26 @@
 		(*ifp->if_input)(ifp, mhead);
 		PTNET_Q_LOCK(pq);
 
+		if (++batch_count == PTNET_RX_BATCH) {
+			/* Some packets have been pushed to the network stack.
+			 * We need to update the CSB to tell the host about the new
+			 * ring->cur and ring->head (RX buffer refill). */
+			ptnet_ring_update(pq, kring, head, NAF_FORCE_READ);
+			batch_count = 0;
+		}
 	} while (--budget);
 escape:
-	if (head != ring->head) {
-		/* Some packets have been pushed to the network stack.
-		 * We need to update the CSB to tell the host about the new
-		 * ring->cur and ring->head (RX buffer refill). */
+	if (batch_count) {
 		ptnet_ring_update(pq, kring, head, NAF_FORCE_READ);
 
-		if (!budget) {
-			/* If we ran out of budget or the double-check found new
-			 * slots to process, schedule the taskqueue. */
-			DBG(RD(1, "out of budget: resched h %u t %u\n",
-			      head, ring->tail));
-			taskqueue_enqueue(pq->taskq, &pq->task);
-		}
+	}
+
+	if (!budget) {
+		/* If we ran out of budget or the double-check found new
+		 * slots to process, schedule the taskqueue. */
+		DBG(RD(1, "out of budget: resched h %u t %u\n",
+					head, ring->tail));
+		taskqueue_enqueue(pq->taskq, &pq->task);
 	}
 
 	PTNET_Q_UNLOCK(pq);


More information about the svn-soc-all mailing list