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);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to