socsvn commit: r305583 - soc2016/vincenzo/head/sys/dev/netmap
vincenzo at FreeBSD.org
vincenzo at FreeBSD.org
Mon Jun 27 09:35:18 UTC 2016
Author: vincenzo
Date: Mon Jun 27 09:35:16 2016
New Revision: 305583
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305583
Log:
freebsd: ptnet_rx_eof: add double-check with rescheduling
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 09:35:06 2016 (r305582)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c Mon Jun 27 09:35:16 2016 (r305583)
@@ -955,7 +955,7 @@
* when some free slots are made available by the host. */
ptring->guest_need_kick = 1;
- /* Double check. */
+ /* Double-check. */
ptnet_sync_tail(ptring, kring);
if (unlikely(head != ring->tail)) {
RD(1, "Found more slots by doublecheck");
@@ -1326,7 +1326,6 @@
unsigned int budget = PTNET_RX_BUDGET;
unsigned int head = ring->head;
struct ifnet *ifp = sc->ifp;
- unsigned int more;
PTNET_Q_LOCK(pq);
@@ -1377,10 +1376,6 @@
budget--;
}
- /* Reactivate interrupts as they were disabled by the host thread right
- * before issuing the last interrupt. */
- ptring->guest_need_kick = 1;
-
if (budget != PTNET_RX_BUDGET) {
/* Some packets have been pushed to the network stack.
* We need to update the CSB to tell the host about the new
@@ -1401,17 +1396,30 @@
}
}
- more = (head != ring->tail);
+ 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;
- PTNET_Q_UNLOCK(pq);
+ /* Double-check. */
+ ptnet_sync_tail(ptring, kring);
+ if (unlikely(head != ring->tail)) {
+ ptring->guest_need_kick = 0;
+ }
+ }
- if (more) {
+ if (head != ring->tail) {
+ /* If we ran out of budget or the double-check found new
+ * slots to process, schedule the taskqueue. */
device_printf(sc->dev, "%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;
}
More information about the svn-soc-all
mailing list