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.

MFC after:	1 week
This commit is contained in:
Vincenzo Maffione 2020-06-03 05:09:33 +00:00
parent 1dccf71b4b
commit 1b89d00bd4

View File

@ -1916,6 +1916,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;
@ -1934,8 +1937,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);
@ -1971,11 +1979,24 @@ 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);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {