Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Jun 2016 16:24:22 GMT
From:      vincenzo@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305297 - soc2016/vincenzo/head/sys/dev/netmap
Message-ID:  <201606171624.u5HGOMuX024821@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: vincenzo
Date: Fri Jun 17 16:24:22 2016
New Revision: 305297
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305297

Log:
   freebsd: ptnet_rx_eof: update CSB with new cur/head

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	Fri Jun 17 16:24:11 2016	(r305296)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Fri Jun 17 16:24:22 2016	(r305297)
@@ -808,7 +808,7 @@
 	 * head in the CSB. */
 	ptnetmap_guest_write_kring_csb(ptring, kring->rcur, kring->rhead);
 
-        /* Ask for a kick from a guest to the host if needed. */
+        /* Kick the host if needed. */
 	if (NM_ACCESS_ONCE(ptring->host_need_kick)) {
 		ptring->sync_flags = NAF_FORCE_RECLAIM;
 		bus_write_4(sc->iomem, pq->kick, 0);
@@ -1144,6 +1144,8 @@
 	ptnet_rx_eof(pq);
 }
 
+#define RX_BUDGET	512
+
 static int
 ptnet_rx_eof(struct ptnet_queue *pq)
 {
@@ -1155,7 +1157,7 @@
 	unsigned int const lim = kring->nkr_num_slots - 1;
 	unsigned int head = ring->head;
 	struct ifnet *ifp = sc->ifp;
-	unsigned int budget = 512;
+	unsigned int budget = RX_BUDGET;
 
 	PTNET_Q_LOCK(pq);
 
@@ -1198,11 +1200,32 @@
 		PTNET_Q_UNLOCK(pq);
 		(*ifp->if_input)(ifp, m);
 		PTNET_Q_LOCK(pq);
+		device_printf(sc->dev, "%s: if_input(%p)\n", __func__, m);
 next:
 		head = nm_next(head, lim);
 		budget--;
 	}
 
+	if (budget != RX_BUDGET) {
+		/* 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). */
+		ring->head = ring->cur = head;
+
+		/* Mimic rxsync_prologue */
+		kring->rcur = ring->cur;
+		kring->rhead = ring->head;
+
+		ptnetmap_guest_write_kring_csb(ptring, kring->rcur,
+					       kring->rhead);
+
+		/* Kick the host if needed. */
+		if (NM_ACCESS_ONCE(ptring->host_need_kick)) {
+			ptring->sync_flags = NAF_FORCE_READ;
+			bus_write_4(sc->iomem, pq->kick, 0);
+		}
+	}
+
 	PTNET_Q_UNLOCK(pq);
 
 	return 0;



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