Module Name: src Committed By: knakahara Date: Fri Jan 31 12:04:57 UTC 2020
Modified Files: src/sys/dev/pci: if_wm.c Log Message: Fix missing workqueue_destroy(). ok by msaitoh@n.o To generate a diff of this commit: cvs rdiff -u -r1.664 -r1.665 src/sys/dev/pci/if_wm.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_wm.c diff -u src/sys/dev/pci/if_wm.c:1.664 src/sys/dev/pci/if_wm.c:1.665 --- src/sys/dev/pci/if_wm.c:1.664 Fri Jan 31 12:03:23 2020 +++ src/sys/dev/pci/if_wm.c Fri Jan 31 12:04:57 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.664 2020/01/31 12:03:23 knakahara Exp $ */ +/* $NetBSD: if_wm.c,v 1.665 2020/01/31 12:04:57 knakahara Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -82,7 +82,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.664 2020/01/31 12:03:23 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.665 2020/01/31 12:04:57 knakahara Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -3127,6 +3127,9 @@ wm_detach(device_t self, int flags __unu } pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs); + /* wm_stop() ensure workqueue is stopped. */ + workqueue_destroy(sc->sc_queue_wq); + for (i = 0; i < sc->sc_nqueues; i++) softint_disestablish(sc->sc_queue[i].wmq_si); @@ -6401,6 +6404,16 @@ wm_stop(struct ifnet *ifp, int disable) WM_CORE_LOCK(sc); wm_stop_locked(ifp, disable); WM_CORE_UNLOCK(sc); + + /* + * After wm_set_stopping_flags(), it is guaranteed + * wm_handle_queue_work() does not call workqueue_enqueue(). + * However, workqueue_wait() cannot call in wm_stop_locked() + * because it can sleep... + * so, call workqueue_wait() here. + */ + for (int i = 0; i < sc->sc_nqueues; i++) + workqueue_wait(sc->sc_queue_wq, &sc->sc_queue[i].wmq_cookie); } static void