Module Name:    src
Committed By:   riastradh
Date:           Thu Aug  2 06:09:05 UTC 2018

Modified Files:
        src/sys/dev/usb: if_athn_usb.c if_atu.c if_aue.c if_axe.c if_axen.c
            if_cue.c if_otus.c if_rum.c if_run.c if_smsc.c if_udav.c if_upgt.c
            if_ural.c if_url.c if_urtw.c if_urtwn.c if_zyd.c uatp.c usb.c
            usb_subr.c usbdi.h

Log Message:
Fix usb_rem_task_wait API.

- Return whether it removed task from queue or not.
  . True if it was on the queue and we intercepted it before it ran.
  . False if we could not intercept it: either it wasn't queued,
    or it already ran.  (Up to caller to distinguish these cases.)
- Pass an optional interlock like callout_halt.

While here, simplify.

ok mrg@


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_athn_usb.c \
    src/sys/dev/usb/if_run.c
cvs rdiff -u -r1.62 -r1.63 src/sys/dev/usb/if_atu.c src/sys/dev/usb/if_rum.c \
    src/sys/dev/usb/if_urtwn.c
cvs rdiff -u -r1.144 -r1.145 src/sys/dev/usb/if_aue.c
cvs rdiff -u -r1.91 -r1.92 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.79 -r1.80 src/sys/dev/usb/if_cue.c
cvs rdiff -u -r1.34 -r1.35 src/sys/dev/usb/if_otus.c
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.54 -r1.55 src/sys/dev/usb/if_udav.c
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/usb/if_upgt.c
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/usb/if_ural.c
cvs rdiff -u -r1.59 -r1.60 src/sys/dev/usb/if_url.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/usb/if_urtw.c src/sys/dev/usb/uatp.c
cvs rdiff -u -r1.49 -r1.50 src/sys/dev/usb/if_zyd.c
cvs rdiff -u -r1.170 -r1.171 src/sys/dev/usb/usb.c
cvs rdiff -u -r1.225 -r1.226 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.94 -r1.95 src/sys/dev/usb/usbdi.h

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/usb/if_athn_usb.c
diff -u src/sys/dev/usb/if_athn_usb.c:1.28 src/sys/dev/usb/if_athn_usb.c:1.29
--- src/sys/dev/usb/if_athn_usb.c:1.28	Sun Jul 29 01:59:56 2018
+++ src/sys/dev/usb/if_athn_usb.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_athn_usb.c,v 1.28 2018/07/29 01:59:56 riastradh Exp $	*/
+/*	$NetBSD: if_athn_usb.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_athn_usb.c,v 1.12 2013/01/14 09:50:31 jsing Exp $	*/
 
 /*-
@@ -22,7 +22,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_athn_usb.c,v 1.28 2018/07/29 01:59:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_athn_usb.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef	_KERNEL_OPT
 #include "opt_inet.h"
@@ -335,7 +335,8 @@ athn_usb_attach(device_t parent, device_
 	athn_usb_free_tx_cmd(usc);
 	athn_usb_free_tx_msg(usc);
 	athn_usb_close_pipes(usc);
-	usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	cv_destroy(&usc->usc_cmd_cv);
 	cv_destroy(&usc->usc_msg_cv);
@@ -501,7 +502,8 @@ athn_usb_detach(device_t self, int flags
 
 	athn_usb_wait_async(usc);
 
-	usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	/* Abort Tx/Rx pipes. */
 	athn_usb_abort_pipes(usc);
Index: src/sys/dev/usb/if_run.c
diff -u src/sys/dev/usb/if_run.c:1.28 src/sys/dev/usb/if_run.c:1.29
--- src/sys/dev/usb/if_run.c:1.28	Sun Jul 29 02:01:22 2018
+++ src/sys/dev/usb/if_run.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_run.c,v 1.28 2018/07/29 02:01:22 riastradh Exp $	*/
+/*	$NetBSD: if_run.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.28 2018/07/29 02:01:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -762,7 +762,8 @@ run_detach(device_t self, int flags)
 		run_stop(ifp, 0);
 		callout_halt(&sc->scan_to, NULL);
 		callout_halt(&sc->calib_to, NULL);
-		usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+		usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER,
+		    NULL);
 	}
 
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);

Index: src/sys/dev/usb/if_atu.c
diff -u src/sys/dev/usb/if_atu.c:1.62 src/sys/dev/usb/if_atu.c:1.63
--- src/sys/dev/usb/if_atu.c:1.62	Sun Jul 29 02:00:07 2018
+++ src/sys/dev/usb/if_atu.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_atu.c,v 1.62 2018/07/29 02:00:07 riastradh Exp $ */
+/*	$NetBSD: if_atu.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $ */
 /*	$OpenBSD: if_atu.c,v 1.48 2004/12/30 01:53:21 dlg Exp $ */
 /*
  * Copyright (c) 2003, 2004
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_atu.c,v 1.62 2018/07/29 02:00:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_atu.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -2235,7 +2235,7 @@ atu_stop(struct ifnet *ifp, int disable)
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 	ifp->if_timer = 0;
 
-	usb_rem_task_wait(sc->atu_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->atu_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
 
 	/* Stop transfers. */
Index: src/sys/dev/usb/if_rum.c
diff -u src/sys/dev/usb/if_rum.c:1.62 src/sys/dev/usb/if_rum.c:1.63
--- src/sys/dev/usb/if_rum.c:1.62	Sun Jul 29 02:01:11 2018
+++ src/sys/dev/usb/if_rum.c	Thu Aug  2 06:09:04 2018
@@ -1,5 +1,5 @@
 /*	$OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $	*/
-/*	$NetBSD: if_rum.c,v 1.62 2018/07/29 02:01:11 riastradh Exp $	*/
+/*	$NetBSD: if_rum.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2005-2007 Damien Bergamini <damien.bergam...@free.fr>
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.62 2018/07/29 02:01:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -498,7 +498,7 @@ rum_detach(device_t self, int flags)
 	rum_stop(ifp, 1);
 	callout_halt(&sc->sc_scan_ch, NULL);
 	callout_halt(&sc->sc_amrr_ch, NULL);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
 
 	bpf_detach(ifp);
 	ieee80211_ifdetach(ic);	/* free all nodes */
Index: src/sys/dev/usb/if_urtwn.c
diff -u src/sys/dev/usb/if_urtwn.c:1.62 src/sys/dev/usb/if_urtwn.c:1.63
--- src/sys/dev/usb/if_urtwn.c:1.62	Mon Jul 30 00:17:28 2018
+++ src/sys/dev/usb/if_urtwn.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urtwn.c,v 1.62 2018/07/30 00:17:28 jmcneill Exp $	*/
+/*	$NetBSD: if_urtwn.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $	*/
 
 /*-
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.62 2018/07/30 00:17:28 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -544,7 +544,8 @@ urtwn_detach(device_t self, int flags)
 
 	if (ISSET(sc->sc_flags, URTWN_FLAG_ATTACHED)) {
 		urtwn_stop(ifp, 0);
-		usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+		usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER,
+		    NULL);
 
 		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 		bpf_detach(ifp);

Index: src/sys/dev/usb/if_aue.c
diff -u src/sys/dev/usb/if_aue.c:1.144 src/sys/dev/usb/if_aue.c:1.145
--- src/sys/dev/usb/if_aue.c:1.144	Sun Jul 29 02:00:17 2018
+++ src/sys/dev/usb/if_aue.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $	*/
+/*	$NetBSD: if_aue.c,v 1.145 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.145 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -894,8 +894,10 @@ aue_detach(device_t self, int flags)
 	 * deactivation guaranteed to have already happened?
 	 */
 	callout_halt(&sc->aue_stat_ch, NULL);
-	usb_rem_task_wait(sc->aue_udev, &sc->aue_tick_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->aue_udev, &sc->aue_stop_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->aue_udev, &sc->aue_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->aue_udev, &sc->aue_stop_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	sc->aue_closing = 1;
 	cv_signal(&sc->aue_domc);

Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.91 src/sys/dev/usb/if_axe.c:1.92
--- src/sys/dev/usb/if_axe.c:1.91	Sun Jul 29 02:00:27 2018
+++ src/sys/dev/usb/if_axe.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axe.c,v 1.91 2018/07/29 02:00:27 riastradh Exp $	*/
+/*	$NetBSD: if_axe.c,v 1.92 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.91 2018/07/29 02:00:27 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.92 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1112,7 +1112,8 @@ axe_detach(device_t self, int flags)
 		usbd_abort_pipe(sc->axe_ep[AXE_ENDPT_INTR]);
 
 	callout_halt(&sc->axe_stat_ch, NULL);
-	usb_rem_task_wait(sc->axe_udev, &sc->axe_tick_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->axe_udev, &sc->axe_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	s = splusb();
 

Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.15 src/sys/dev/usb/if_axen.c:1.16
--- src/sys/dev/usb/if_axen.c:1.15	Sun Jul 29 02:00:38 2018
+++ src/sys/dev/usb/if_axen.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.15 2018/07/29 02:00:38 riastradh Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.16 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.15 2018/07/29 02:00:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.16 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -829,7 +829,7 @@ axen_detach(device_t self, int flags)
 
 	callout_halt(&sc->axen_stat_ch, NULL);
 	usb_rem_task_wait(sc->axen_udev, &sc->axen_tick_task,
-	    USB_TASKQ_DRIVER);
+	    USB_TASKQ_DRIVER, NULL);
 
 	s = splusb();
 

Index: src/sys/dev/usb/if_cue.c
diff -u src/sys/dev/usb/if_cue.c:1.79 src/sys/dev/usb/if_cue.c:1.80
--- src/sys/dev/usb/if_cue.c:1.79	Sun Jul 29 02:00:48 2018
+++ src/sys/dev/usb/if_cue.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cue.c,v 1.79 2018/07/29 02:00:48 riastradh Exp $	*/
+/*	$NetBSD: if_cue.c,v 1.80 2018/08/02 06:09:04 riastradh Exp $	*/
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
  *	Bill Paul <wp...@ee.columbia.edu>.  All rights reserved.
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.79 2018/07/29 02:00:48 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.80 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -579,8 +579,10 @@ cue_detach(device_t self, int flags)
 	 * deactivation guaranteed to have already happened?
 	 */
 	callout_halt(&sc->cue_stat_ch, NULL);
-	usb_rem_task_wait(sc->cue_udev, &sc->cue_tick_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->cue_udev, &sc->cue_stop_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->cue_udev, &sc->cue_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->cue_udev, &sc->cue_stop_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	if (!sc->cue_attached) {
 		/* Detached before attached finished, so just bail out. */

Index: src/sys/dev/usb/if_otus.c
diff -u src/sys/dev/usb/if_otus.c:1.34 src/sys/dev/usb/if_otus.c:1.35
--- src/sys/dev/usb/if_otus.c:1.34	Sun Jul 29 02:00:59 2018
+++ src/sys/dev/usb/if_otus.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_otus.c,v 1.34 2018/07/29 02:00:59 riastradh Exp $	*/
+/*	$NetBSD: if_otus.c,v 1.35 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_otus.c,v 1.18 2010/08/27 17:08:00 jsg Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.34 2018/07/29 02:00:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.35 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -701,7 +701,7 @@ otus_detach(device_t self, int flags)
 	if (ifp != NULL)	/* Failed to attach properly */
 		otus_stop(ifp);
 
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
 	callout_destroy(&sc->sc_scan_to);
 	callout_destroy(&sc->sc_calib_to);
 

Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.35 src/sys/dev/usb/if_smsc.c:1.36
--- src/sys/dev/usb/if_smsc.c:1.35	Sun Jul 29 02:01:32 2018
+++ src/sys/dev/usb/if_smsc.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_smsc.c,v 1.35 2018/07/29 02:01:32 riastradh Exp $	*/
+/*	$NetBSD: if_smsc.c,v 1.36 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*	$OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */
@@ -1149,8 +1149,10 @@ smsc_detach(device_t self, int flags)
 	if (sc->sc_ep[SMSC_ENDPT_INTR] != NULL)
 		usbd_abort_pipe(sc->sc_ep[SMSC_ENDPT_INTR]);
 
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	s = splusb();
 

Index: src/sys/dev/usb/if_udav.c
diff -u src/sys/dev/usb/if_udav.c:1.54 src/sys/dev/usb/if_udav.c:1.55
--- src/sys/dev/usb/if_udav.c:1.54	Sun Jul 29 02:01:43 2018
+++ src/sys/dev/usb/if_udav.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_udav.c,v 1.54 2018/07/29 02:01:43 riastradh Exp $	*/
+/*	$NetBSD: if_udav.c,v 1.55 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $	*/
 
 /*
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.54 2018/07/29 02:01:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.55 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -355,8 +355,10 @@ udav_detach(device_t self, int flags)
 	callout_halt(&sc->sc_stat_ch, NULL);
 
 	/* Remove any pending tasks */
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	s = splusb();
 

Index: src/sys/dev/usb/if_upgt.c
diff -u src/sys/dev/usb/if_upgt.c:1.21 src/sys/dev/usb/if_upgt.c:1.22
--- src/sys/dev/usb/if_upgt.c:1.21	Sun Jul 29 02:01:54 2018
+++ src/sys/dev/usb/if_upgt.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upgt.c,v 1.21 2018/07/29 02:01:54 riastradh Exp $	*/
+/*	$NetBSD: if_upgt.c,v 1.22 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_upgt.c,v 1.49 2010/04/20 22:05:43 tedu Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.21 2018/07/29 02:01:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.22 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -506,8 +506,10 @@ upgt_detach(device_t self, int flags)
 	/* remove tasks and timeouts */
 	callout_halt(&sc->scan_to, NULL);
 	callout_halt(&sc->led_to, NULL);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task_newstate, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task_tx, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task_newstate, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task_tx, USB_TASKQ_DRIVER,
+	    NULL);
 	callout_destroy(&sc->scan_to);
 	callout_destroy(&sc->led_to);
 

Index: src/sys/dev/usb/if_ural.c
diff -u src/sys/dev/usb/if_ural.c:1.56 src/sys/dev/usb/if_ural.c:1.57
--- src/sys/dev/usb/if_ural.c:1.56	Sun Jul 29 02:02:04 2018
+++ src/sys/dev/usb/if_ural.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ural.c,v 1.56 2018/07/29 02:02:04 riastradh Exp $ */
+/*	$NetBSD: if_ural.c,v 1.57 2018/08/02 06:09:04 riastradh Exp $ */
 /*	$FreeBSD: /repoman/r/ncvs/src/sys/dev/usb/if_ural.c,v 1.40 2006/06/02 23:14:40 sam Exp $	*/
 
 /*-
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.56 2018/07/29 02:02:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.57 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -536,7 +536,7 @@ ural_detach(device_t self, int flags)
 	ural_stop(ifp, 1);
 	callout_halt(&sc->sc_scan_ch, NULL);
 	callout_halt(&sc->sc_amrr_ch, NULL);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
 
 	bpf_detach(ifp);
 	ieee80211_ifdetach(ic);

Index: src/sys/dev/usb/if_url.c
diff -u src/sys/dev/usb/if_url.c:1.59 src/sys/dev/usb/if_url.c:1.60
--- src/sys/dev/usb/if_url.c:1.59	Sun Jul 29 02:08:17 2018
+++ src/sys/dev/usb/if_url.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_url.c,v 1.59 2018/07/29 02:08:17 riastradh Exp $	*/
+/*	$NetBSD: if_url.c,v 1.60 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.59 2018/07/29 02:08:17 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.60 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -356,8 +356,10 @@ url_detach(device_t self, int flags)
 	callout_halt(&sc->sc_stat_ch, NULL);
 
 	/* Remove any pending tasks */
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+	    NULL);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+	    NULL);
 
 	s = splusb();
 

Index: src/sys/dev/usb/if_urtw.c
diff -u src/sys/dev/usb/if_urtw.c:1.16 src/sys/dev/usb/if_urtw.c:1.17
--- src/sys/dev/usb/if_urtw.c:1.16	Sun Jul 29 02:06:11 2018
+++ src/sys/dev/usb/if_urtw.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urtw.c,v 1.16 2018/07/29 02:06:11 riastradh Exp $	*/
+/*	$NetBSD: if_urtw.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $	*/
 
 /*-
@@ -19,7 +19,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.16 2018/07/29 02:06:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -779,8 +779,9 @@ urtw_detach(device_t self, int flags)
 	callout_destroy(&sc->scan_to);
 	callout_destroy(&sc->sc_led_ch);
 
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER,
+	    NULL);
 
 	if (ifp->if_softc != NULL) {
 		bpf_detach(ifp);
Index: src/sys/dev/usb/uatp.c
diff -u src/sys/dev/usb/uatp.c:1.16 src/sys/dev/usb/uatp.c:1.17
--- src/sys/dev/usb/uatp.c:1.16	Sun Jul 29 02:07:46 2018
+++ src/sys/dev/usb/uatp.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: uatp.c,v 1.16 2018/07/29 02:07:46 riastradh Exp $	*/
+/*	$NetBSD: uatp.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2011-2014 The NetBSD Foundation, Inc.
@@ -146,7 +146,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.16 2018/07/29 02:07:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1363,7 +1363,7 @@ geyser34_finalize(struct uatp_softc *sc)
 
 	DPRINTF(sc, UATP_DEBUG_MISC, ("finalizing\n"));
 	usb_rem_task_wait(sc->sc_hdev.sc_parent->sc_udev, &sc->sc_reset_task,
-	    USB_TASKQ_DRIVER);
+	    USB_TASKQ_DRIVER, NULL);
 
 	return 0;
 }

Index: src/sys/dev/usb/if_zyd.c
diff -u src/sys/dev/usb/if_zyd.c:1.49 src/sys/dev/usb/if_zyd.c:1.50
--- src/sys/dev/usb/if_zyd.c:1.49	Sun Jul 29 02:07:33 2018
+++ src/sys/dev/usb/if_zyd.c	Thu Aug  2 06:09:04 2018
@@ -1,5 +1,5 @@
 /*	$OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $	*/
-/*	$NetBSD: if_zyd.c,v 1.49 2018/07/29 02:07:33 riastradh Exp $	*/
+/*	$NetBSD: if_zyd.c,v 1.50 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2006 by Damien Bergamini <damien.bergam...@free.fr>
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.49 2018/07/29 02:07:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.50 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -468,7 +468,7 @@ zyd_detach(device_t self, int flags)
 	zyd_stop(ifp, 1);
 	callout_halt(&sc->sc_scan_ch, NULL);
 	callout_halt(&sc->sc_amrr_ch, NULL);
-	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
 
 	/* Abort, etc. done by zyd_stop */
 	zyd_close_pipes(sc);

Index: src/sys/dev/usb/usb.c
diff -u src/sys/dev/usb/usb.c:1.170 src/sys/dev/usb/usb.c:1.171
--- src/sys/dev/usb/usb.c:1.170	Sun Jul 29 01:59:46 2018
+++ src/sys/dev/usb/usb.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb.c,v 1.170 2018/07/29 01:59:46 riastradh Exp $	*/
+/*	$NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.170 2018/07/29 01:59:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -458,28 +458,13 @@ usb_rem_task(struct usbd_device *dev, st
 }
 
 /*
- * usb_taskq_wait(taskq, task)
- *
- *	Wait for taskq to finish executing task, if it is executing
- *	task.  Caller must hold the taskq lock.
- */
-static void
-usb_taskq_wait(struct usb_taskq *taskq, struct usb_task *task)
-{
-
-	KASSERT(mutex_owned(&taskq->lock));
-
-	while (taskq->current_task == task)
-		cv_wait(&taskq->cv, &taskq->lock);
-
-	KASSERT(taskq->current_task != task);
-}
-
-/*
- * usb_rem_task_wait(dev, task, queue)
+ * usb_rem_task_wait(dev, task, queue, interlock)
  *
  *	If task is scheduled to run, remove it from the queue.  If it
- *	may have already begun to run, wait for it to complete.
+ *	may have already begun to run, drop interlock if not null, wait
+ *	for it to complete, and reacquire interlock if not null.
+ *	Return true if it successfully removed the task from the queue,
+ *	false if not.
  *
  *	Caller MUST guarantee that task will not be scheduled on a
  *	_different_ queue, at least until after this returns.
@@ -490,11 +475,13 @@ usb_taskq_wait(struct usb_taskq *taskq, 
  *
  *	May sleep.
  */
-void
-usb_rem_task_wait(struct usbd_device *dev, struct usb_task *task, int queue)
+bool
+usb_rem_task_wait(struct usbd_device *dev, struct usb_task *task, int queue,
+    kmutex_t *interlock)
 {
 	struct usb_taskq *taskq;
 	int queue1;
+	bool removed;
 
 	USBHIST_FUNC(); USBHIST_CALLED(usbdebug);
 	ASSERT_SLEEPABLE();
@@ -502,38 +489,40 @@ usb_rem_task_wait(struct usbd_device *de
 	KASSERT(queue < USB_NUM_TASKQS);
 
 	taskq = &usb_taskq[queue];
-
-	if ((queue1 = task->queue) == USB_NUM_TASKQS) {
+	mutex_enter(&taskq->lock);
+	queue1 = task->queue;
+	if (queue1 == USB_NUM_TASKQS) {
 		/*
-		 * It is not on the queue, but it may have already run.
-		 * Wait for it.
+		 * It is not on the queue.  It may be about to run, or
+		 * it may have already finished running -- there is no
+		 * stopping it now.  Wait for it if it is running.
 		 */
-		mutex_enter(&taskq->lock);
-		usb_taskq_wait(taskq, task);
-		mutex_exit(&taskq->lock);
+		if (interlock)
+			mutex_exit(interlock);
+		while (taskq->current_task == task)
+			cv_wait(&taskq->cv, &taskq->lock);
+		removed = false;
 	} else {
 		/*
-		 * It may be on the queue (and not another one), but
-		 * the state may have changed by now because we don't
-		 * have the queue locked.  Lock and reload.
+		 * It is still on the queue.  We can stop it before the
+		 * task thread will run it.
 		 */
-		KASSERTMSG(queue1 == queue,
-		    "task %p on q%d expected on q%d", task, queue1, queue);
-		mutex_enter(&taskq->lock);
-		queue1 = task->queue;
-		if (queue1 == queue) {
-			/* Still queued, not run.  Just remove it.  */
-			TAILQ_REMOVE(&taskq->tasks, task, next);
-			task->queue = USB_NUM_TASKQS;
-		} else {
-			/* Already ran.  Wait for it.  */
-			KASSERTMSG(queue1 == USB_NUM_TASKQS,
-			    "task %p on q%d expected on q%d",
-			    task, queue1, queue);
-			usb_taskq_wait(taskq, task);
-		}
-		mutex_exit(&taskq->lock);
+		KASSERTMSG(queue1 == queue, "task %p on q%d expected on q%d",
+		    task, queue1, queue);
+		TAILQ_REMOVE(&taskq->tasks, task, next);
+		task->queue = USB_NUM_TASKQS;
+		removed = true;
 	}
+	mutex_exit(&taskq->lock);
+
+	/*
+	 * If there's an interlock, and we dropped it to wait,
+	 * reacquire it.
+	 */
+	if (interlock && !removed)
+		mutex_enter(interlock);
+
+	return removed;
 }
 
 void

Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.225 src/sys/dev/usb/usb_subr.c:1.226
--- src/sys/dev/usb/usb_subr.c:1.225	Sun Jul 29 02:08:07 2018
+++ src/sys/dev/usb/usb_subr.c	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb_subr.c,v 1.225 2018/07/29 02:08:07 riastradh Exp $	*/
+/*	$NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.225 2018/07/29 02:08:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -823,7 +823,8 @@ usbd_kill_pipe(struct usbd_pipe *pipe)
 	usbd_lock_pipe(pipe);
 	pipe->up_methods->upm_close(pipe);
 	usbd_unlock_pipe(pipe);
-	usb_rem_task_wait(pipe->up_dev, &pipe->up_async_task, USB_TASKQ_DRIVER);
+	usb_rem_task_wait(pipe->up_dev, &pipe->up_async_task, USB_TASKQ_DRIVER,
+	    NULL);
 	pipe->up_endpoint->ue_refcnt--;
 	kmem_free(pipe, pipe->up_dev->ud_bus->ub_pipesize);
 }

Index: src/sys/dev/usb/usbdi.h
diff -u src/sys/dev/usb/usbdi.h:1.94 src/sys/dev/usb/usbdi.h:1.95
--- src/sys/dev/usb/usbdi.h:1.94	Tue Jul 31 16:44:30 2018
+++ src/sys/dev/usb/usbdi.h	Thu Aug  2 06:09:04 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdi.h,v 1.94 2018/07/31 16:44:30 khorben Exp $	*/
+/*	$NetBSD: usbdi.h,v 1.95 2018/08/02 06:09:04 riastradh Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $	*/
 
 /*
@@ -221,7 +221,8 @@ struct usb_task {
 
 void usb_add_task(struct usbd_device *, struct usb_task *, int);
 void usb_rem_task(struct usbd_device *, struct usb_task *);
-void usb_rem_task_wait(struct usbd_device *, struct usb_task *, int);
+bool usb_rem_task_wait(struct usbd_device *, struct usb_task *, int,
+    kmutex_t *);
 #define usb_init_task(t, f, a, fl) ((t)->fun = (f), (t)->arg = (a), (t)->queue = USB_NUM_TASKQS, (t)->flags = (fl))
 
 struct usb_devno {

Reply via email to