svn commit: r362856 - stable/12/sys/dev/virtio/network
Vincenzo Maffione
vmaffione at FreeBSD.org
Wed Jul 1 19:42:24 UTC 2020
Author: vmaffione
Date: Wed Jul 1 19:42:23 2020
New Revision: 362856
URL: https://svnweb.freebsd.org/changeset/base/362856
Log:
MFC r362204
if_vtnet: let vtnet_rx_vq_intr() and vtnet_rxq_tq_intr() share code
Since the two functions are similar, introduce a common function
(vtnet_rx_vq_process()) to share common code.
This also improves locking, by ensuring vrxs_rescheduled is accessed
under the RXQ lock, and taskqueue_enqueue() is not called under the
lock (therefore avoiding a spurious duplicate lock warning).
Reported by: jrtc27
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 Jul 1 19:41:10 2020 (r362855)
+++ stable/12/sys/dev/virtio/network/if_vtnet.c Wed Jul 1 19:42:23 2020 (r362856)
@@ -127,6 +127,7 @@ static int vtnet_rxq_merged_eof(struct vtnet_rxq *, st
static void vtnet_rxq_input(struct vtnet_rxq *, struct mbuf *,
struct virtio_net_hdr *);
static int vtnet_rxq_eof(struct vtnet_rxq *);
+static void vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries);
static void vtnet_rx_vq_intr(void *);
static void vtnet_rxq_tq_intr(void *, int);
@@ -1847,20 +1848,17 @@ vtnet_rxq_eof(struct vtnet_rxq *rxq)
}
static void
-vtnet_rx_vq_intr(void *xrxq)
+vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries)
{
struct vtnet_softc *sc;
- struct vtnet_rxq *rxq;
struct ifnet *ifp;
- int tries, more;
+ int more;
#ifdef DEV_NETMAP
int nmirq;
#endif /* DEV_NETMAP */
- rxq = xrxq;
sc = rxq->vtnrx_sc;
ifp = sc->vtnet_ifp;
- tries = 0;
if (__predict_false(rxq->vtnrx_id >= sc->vtnet_act_vq_pairs)) {
/*
@@ -1908,58 +1906,32 @@ again:
* This is an occasional condition or race (when !more),
* so retry a few times before scheduling the taskqueue.
*/
- if (tries++ < VTNET_INTR_DISABLE_RETRIES)
+ if (tries-- > 0)
goto again;
- VTNET_RXQ_UNLOCK(rxq);
rxq->vtnrx_stats.vrxs_rescheduled++;
+ VTNET_RXQ_UNLOCK(rxq);
taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
} else
VTNET_RXQ_UNLOCK(rxq);
}
static void
-vtnet_rxq_tq_intr(void *xrxq, int pending)
+vtnet_rx_vq_intr(void *xrxq)
{
- struct vtnet_softc *sc;
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;
+ vtnet_rx_vq_process(rxq, VTNET_INTR_DISABLE_RETRIES);
+}
- VTNET_RXQ_LOCK(rxq);
+static void
+vtnet_rxq_tq_intr(void *xrxq, int pending)
+{
+ struct vtnet_rxq *rxq;
-#ifdef DEV_NETMAP
- nmirq = netmap_rx_irq(ifp, rxq->vtnrx_id, &more);
- if (nmirq != NM_IRQ_PASS) {
- VTNET_RXQ_UNLOCK(rxq);
- if (nmirq == NM_IRQ_RESCHED) {
- taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
- }
- return;
- }
-#endif /* DEV_NETMAP */
-
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
- VTNET_RXQ_UNLOCK(rxq);
- return;
- }
-
- more = vtnet_rxq_eof(rxq);
- if (more || vtnet_rxq_enable_intr(rxq) != 0) {
- if (!more)
- vtnet_rxq_disable_intr(rxq);
- rxq->vtnrx_stats.vrxs_rescheduled++;
- taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
- }
-
- VTNET_RXQ_UNLOCK(rxq);
+ rxq = xrxq;
+ vtnet_rx_vq_process(rxq, 0);
}
static int
More information about the svn-src-stable
mailing list