Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Jun 2016 12:55:25 GMT
From:      vincenzo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305591 - soc2016/vincenzo/head/sys/dev/netmap
Message-ID:  <201606271255.u5RCtPmC098438@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vincenzo
Date: Mon Jun 27 12:55:24 2016
New Revision: 305591
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305591

Log:
   freebsd: ptnet_rx_eof: lazy syncing (read) from CSB

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 Jun 27 12:49:22 2016	(r305590)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jun 27 12:55:24 2016	(r305591)
@@ -1336,24 +1336,49 @@
 	struct netmap_kring *kring = na->rx_rings + pq->kring_id;
 	struct netmap_ring *ring = kring->ring;
 	unsigned int const lim = kring->nkr_num_slots - 1;
+	unsigned int budget = PTNET_RX_BUDGET;
+	unsigned int head = ring->head;
 	struct ifnet *ifp = sc->ifp;
-	unsigned int budget, head;
 
 	PTNET_Q_LOCK(pq);
 
-	/* Update hwtail, rtail, tail and hwcur to what is known from the host,
-	 * reading from CSB. */
-	ptnet_sync_tail(ptring, kring);
-
 	kring->nr_kflags &= ~NKR_PENDINTR;
 
-	for (head = ring->head, budget = PTNET_RX_BUDGET;
-		head != ring->tail && budget;
-			head = nm_next(head, lim), budget--) {
+	for (;;) {
 		struct netmap_slot *slot = ring->slot + head;
-		unsigned int nmbuf_len = slot->len;
-		uint8_t *nmbuf = NMB(na, slot);
+		unsigned int nmbuf_len;
 		struct mbuf *m;
+		uint8_t *nmbuf;
+
+		if (budget == 0) {
+			RD(1, "Run out of budget h %u t %u", head, ring->tail);
+			break;
+		}
+
+		if (head == ring->tail) {
+			/* We ran out of slot, let's see if the host has
+			 * added some, by reading hwcur and hwtail from
+			 * the CSB. */
+			ptnet_sync_tail(ptring, kring);
+
+			if (head == ring->tail) {
+				/* Still no slots available. Reactivate
+				 * interrupts as they were disabled by the
+				 * host thread right before issuing the
+				 * last interrupt. */
+				ptring->guest_need_kick = 1;
+
+				/* Double-check. */
+				ptnet_sync_tail(ptring, kring);
+				if (likely(head == ring->tail)) {
+					break;
+				}
+				ptring->guest_need_kick = 0;
+			}
+		}
+
+		nmbuf_len = slot->len;
+		nmbuf = NMB(na, slot);
 
 		if (unlikely(nmbuf_len > MCLBYTES)) {
 			RD(1, "Dropping long frame: len %u > %u",
@@ -1385,6 +1410,9 @@
 		PTNET_Q_UNLOCK(pq);
 		(*ifp->if_input)(ifp, m);
 		PTNET_Q_LOCK(pq);
+
+		head = nm_next(head, lim);
+		budget--;
 	}
 
 	if (head != ring->head) {
@@ -1405,30 +1433,16 @@
 			ptring->sync_flags = NAF_FORCE_READ;
 			bus_write_4(sc->iomem, pq->kick, 0);
 		}
-	}
 
-	if (head == ring->tail) {
-		/* No more slots to process. Reactivate interrupts as they
-		 * were disabled by the host thread right before issuing the
-		 * last interrupt. */
-		ptring->guest_need_kick = 1;
-
-		/* Double-check. */
-		ptnet_sync_tail(ptring, kring);
-		if (unlikely(head != ring->tail)) {
-			ptring->guest_need_kick = 0;
+		if (!budget) {
+			/* If we ran out of budget or the double-check found new
+			 * slots to process, schedule the taskqueue. */
+			RD(1, "%s: resched: budget %u h %u t %u\n", __func__,
+					budget, head, ring->tail);
+			taskqueue_enqueue(pq->taskq, &pq->task);
 		}
 	}
 
-	if (head != ring->tail) {
-		/* If we ran out of budget or the double-check found new
-		 * slots to process, schedule the taskqueue. */
-		RD(1, "%s: resched: budget %u h %u t %u\n", __func__,
-		   budget, ring->head,
-			      ring->tail);
-		taskqueue_enqueue(pq->taskq, &pq->task);
-	}
-
 	PTNET_Q_UNLOCK(pq);
 
 	return 0;



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