svn commit: r362021 - stable/12/sys/dev/virtio/network

Vincenzo Maffione vmaffione at FreeBSD.org
Wed Jun 10 19:59:12 UTC 2020


Author: vmaffione
Date: Wed Jun 10 19:59:11 2020
New Revision: 362021
URL: https://svnweb.freebsd.org/changeset/base/362021

Log:
  MFC r361744
  
  netmap: vtnet: honor NM_IRQ_RESCHED
  
  The netmap_rx_irq() function may return NM_IRQ_RESCHED to inform the
  driver that more work is pending, and that netmap expects netmap_rx_irq()
  to be called again as soon as possible.
  This change implements this behaviour in the vtnet driver.

Modified:
  stable/12/sys/dev/virtio/network/if_vtnet.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- stable/12/sys/dev/virtio/network/if_vtnet.c	Wed Jun 10 19:58:03 2020	(r362020)
+++ stable/12/sys/dev/virtio/network/if_vtnet.c	Wed Jun 10 19:59:11 2020	(r362021)
@@ -1853,6 +1853,9 @@ vtnet_rx_vq_intr(void *xrxq)
 	struct vtnet_rxq *rxq;
 	struct ifnet *ifp;
 	int tries, more;
+#ifdef DEV_NETMAP
+	int nmirq;
+#endif /* DEV_NETMAP */
 
 	rxq = xrxq;
 	sc = rxq->vtnrx_sc;
@@ -1871,8 +1874,13 @@ vtnet_rx_vq_intr(void *xrxq)
 	}
 
 #ifdef DEV_NETMAP
-	if (netmap_rx_irq(ifp, rxq->vtnrx_id, &more) != NM_IRQ_PASS)
+	nmirq = netmap_rx_irq(ifp, rxq->vtnrx_id, &more);
+	if (nmirq != NM_IRQ_PASS) {
+		if (nmirq == NM_IRQ_RESCHED) {
+			taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
+		}
 		return;
+	}
 #endif /* DEV_NETMAP */
 
 	VTNET_RXQ_LOCK(rxq);
@@ -1908,10 +1916,23 @@ vtnet_rxq_tq_intr(void *xrxq, int pending)
 	struct vtnet_rxq *rxq;
 	struct ifnet *ifp;
 	int more;
+#ifdef DEV_NETMAP
+	int nmirq;
+#endif /* DEV_NETMAP */
 
 	rxq = xrxq;
 	sc = rxq->vtnrx_sc;
 	ifp = sc->vtnet_ifp;
+
+#ifdef DEV_NETMAP
+	nmirq = netmap_rx_irq(ifp, rxq->vtnrx_id, &more);
+	if (nmirq != NM_IRQ_PASS) {
+		if (nmirq == NM_IRQ_RESCHED) {
+			taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
+		}
+		return;
+	}
+#endif /* DEV_NETMAP */
 
 	VTNET_RXQ_LOCK(rxq);
 


More information about the svn-src-all mailing list