usb_detach_wait() will simply wait usb_detach_wakeup() for 60 sec. So
ugen_detach() will continue to destroy device context before threads
finish their io.
Index: sys/dev/usb/ugen.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ugen.c,v
retrieving revision 1.105
diff -u -p -r1.105 ugen.c
--- sys/dev/usb/ugen.c 7 Apr 2020 13:27:51 -0000 1.105
+++ sys/dev/usb/ugen.c 9 Apr 2020 14:08:20 -0000
@@ -764,7 +764,8 @@ ugen_detach(struct device *self, int fla
}
s = splusb();
- if (--sc->sc_refcnt >= 0) {
+ --sc->sc_refcnt;
+ while (sc->sc_refcnt >= 0) {
/* Wake everyone */
for (i = 0; i < USB_MAX_ENDPOINTS; i++)
wakeup(&sc->sc_endpoints[i][IN]);