Module Name:    src
Committed By:   yamaguchi
Date:           Tue Mar 29 01:57:51 UTC 2022

Modified Files:
        src/sys/dev/pci: if_vioif.c

Log Message:
vioif(4): Added a comment about stopping packet processing


To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/pci/if_vioif.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_vioif.c
diff -u src/sys/dev/pci/if_vioif.c:1.75 src/sys/dev/pci/if_vioif.c:1.76
--- src/sys/dev/pci/if_vioif.c:1.75	Thu Mar 24 08:02:21 2022
+++ src/sys/dev/pci/if_vioif.c	Tue Mar 29 01:57:51 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vioif.c,v 1.75 2022/03/24 08:02:21 yamaguchi Exp $	*/
+/*	$NetBSD: if_vioif.c,v 1.76 2022/03/29 01:57:51 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.75 2022/03/24 08:02:21 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vioif.c,v 1.76 2022/03/29 01:57:51 yamaguchi Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -1211,6 +1211,34 @@ vioif_init(struct ifnet *ifp)
 }
 
 static void
+vioif_stop_rendezvous(struct vioif_softc *sc)
+{
+	struct vioif_txqueue *txq;
+	struct vioif_rxqueue *rxq;
+	int i;
+
+	/*
+	 * stop all packet processing:
+	 * 1. acquire a lock for queue to wait
+	 *    for finish of interrupt handler
+	 * 2. stop workqueue for packet processing
+	 */
+
+	for (i =0; i < sc->sc_act_nvq_pairs; i++) {
+		txq = &sc->sc_txq[i];
+		rxq = &sc->sc_rxq[i];
+
+		mutex_enter(rxq->rxq_lock);
+		mutex_exit(rxq->rxq_lock);
+		vioif_work_wait(sc->sc_txrx_workqueue, &rxq->rxq_work);
+
+		mutex_enter(txq->txq_lock);
+		mutex_exit(txq->txq_lock);
+		vioif_work_wait(sc->sc_txrx_workqueue, &txq->txq_work);
+	}
+}
+
+static void
 vioif_stop(struct ifnet *ifp, int disable)
 {
 	struct vioif_softc *sc = ifp->if_softc;
@@ -1243,19 +1271,7 @@ vioif_stop(struct ifnet *ifp, int disabl
 	/* only way to stop I/O and DMA is resetting... */
 	virtio_reset(vsc);
 
-	/* rendezvous for finish of handlers */
-	for (i = 0; i < sc->sc_act_nvq_pairs; i++) {
-		txq = &sc->sc_txq[i];
-		rxq = &sc->sc_rxq[i];
-
-		mutex_enter(rxq->rxq_lock);
-		mutex_exit(rxq->rxq_lock);
-		vioif_work_wait(sc->sc_txrx_workqueue, &rxq->rxq_work);
-
-		mutex_enter(txq->txq_lock);
-		mutex_exit(txq->txq_lock);
-		vioif_work_wait(sc->sc_txrx_workqueue, &txq->txq_work);
-	}
+	vioif_stop_rendezvous(sc);
 
 	for (i = 0; i < sc->sc_act_nvq_pairs; i++) {
 		vioif_rx_queue_clear(&sc->sc_rxq[i]);

Reply via email to