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]);