Module Name:    src
Committed By:   skrll
Date:           Sun Aug 14 14:42:22 UTC 2016

Modified Files:
        src/sys/dev/usb: ehci.c ohci.c usb.c usbdi.h
        src/sys/external/bsd/dwc2: dwc2.c

Log Message:
Change the SOFTINT level from NET to SERIAL for the USB softint handler.
This gives the callback a chance of running when another softint handler
at SOFTINT_NET has blocked holding a lock, e.g. softnet_lock and most of
the network stack.

Should fix/help
kern/49065 - ifconfig tun0 ... sequence locks up system / lockup: softnet_lock 
held across usb xfr
kern/50491 - unkillable wait in usbd_transfer while using usmsc0 on raspberry 
pi 2
kern/51395 - USB Ethernet makes xhci hang

and probably others


To generate a diff of this commit:
cvs rdiff -u -r1.252 -r1.253 src/sys/dev/usb/ehci.c
cvs rdiff -u -r1.263 -r1.264 src/sys/dev/usb/ohci.c
cvs rdiff -u -r1.163 -r1.164 src/sys/dev/usb/usb.c
cvs rdiff -u -r1.91 -r1.92 src/sys/dev/usb/usbdi.h
cvs rdiff -u -r1.43 -r1.44 src/sys/external/bsd/dwc2/dwc2.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/usb/ehci.c
diff -u src/sys/dev/usb/ehci.c:1.252 src/sys/dev/usb/ehci.c:1.253
--- src/sys/dev/usb/ehci.c:1.252	Sat May 14 07:14:31 2016
+++ src/sys/dev/usb/ehci.c	Sun Aug 14 14:42:22 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci.c,v 1.252 2016/05/14 07:14:31 skrll Exp $ */
+/*	$NetBSD: ehci.c,v 1.253 2016/08/14 14:42:22 skrll Exp $ */
 
 /*
  * Copyright (c) 2004-2012 The NetBSD Foundation, Inc.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.252 2016/05/14 07:14:31 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.253 2016/08/14 14:42:22 skrll Exp $");
 
 #include "ohci.h"
 #include "uhci.h"
@@ -418,10 +418,10 @@ ehci_init(ehci_softc_t *sc)
 	sc->sc_xferpool = pool_cache_init(sizeof(struct ehci_xfer), 0, 0, 0,
 	    "ehcixfer", NULL, IPL_USB, NULL, NULL, NULL);
 
-	sc->sc_doorbell_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
+	sc->sc_doorbell_si = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE,
 	    ehci_doorbell, sc);
 	KASSERT(sc->sc_doorbell_si != NULL);
-	sc->sc_pcd_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
+	sc->sc_pcd_si = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE,
 	    ehci_pcd, sc);
 	KASSERT(sc->sc_pcd_si != NULL);
 

Index: src/sys/dev/usb/ohci.c
diff -u src/sys/dev/usb/ohci.c:1.263 src/sys/dev/usb/ohci.c:1.264
--- src/sys/dev/usb/ohci.c:1.263	Tue May 10 15:14:03 2016
+++ src/sys/dev/usb/ohci.c	Sun Aug 14 14:42:22 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ohci.c,v 1.263 2016/05/10 15:14:03 pooka Exp $	*/
+/*	$NetBSD: ohci.c,v 1.264 2016/08/14 14:42:22 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2004, 2005, 2012 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.263 2016/05/10 15:14:03 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.264 2016/08/14 14:42:22 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -786,7 +786,7 @@ ohci_init(ohci_softc_t *sc)
 	mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
 	cv_init(&sc->sc_softwake_cv, "ohciab");
 
-	sc->sc_rhsc_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
+	sc->sc_rhsc_si = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE,
 	    ohci_rhsc_softint, sc);
 
 	for (i = 0; i < OHCI_HASH_SIZE; i++)

Index: src/sys/dev/usb/usb.c
diff -u src/sys/dev/usb/usb.c:1.163 src/sys/dev/usb/usb.c:1.164
--- src/sys/dev/usb/usb.c:1.163	Tue Apr 26 12:58:48 2016
+++ src/sys/dev/usb/usb.c	Sun Aug 14 14:42:22 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb.c,v 1.163 2016/04/26 12:58:48 skrll Exp $	*/
+/*	$NetBSD: usb.c,v 1.164 2016/08/14 14:42:22 skrll 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.163 2016/04/26 12:58:48 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.164 2016/08/14 14:42:22 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -254,7 +254,7 @@ usb_attach(device_t parent, device_t sel
 	aprint_normal("\n");
 
 	/* XXX we should have our own level */
-	sc->sc_bus->ub_soft = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
+	sc->sc_bus->ub_soft = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE,
 	    usb_soft_intr, sc->sc_bus);
 	if (sc->sc_bus->ub_soft == NULL) {
 		aprint_error("%s: can't register softintr\n",

Index: src/sys/dev/usb/usbdi.h
diff -u src/sys/dev/usb/usbdi.h:1.91 src/sys/dev/usb/usbdi.h:1.92
--- src/sys/dev/usb/usbdi.h:1.91	Sat Apr 23 10:15:32 2016
+++ src/sys/dev/usb/usbdi.h	Sun Aug 14 14:42:22 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdi.h,v 1.91 2016/04/23 10:15:32 skrll Exp $	*/
+/*	$NetBSD: usbdi.h,v 1.92 2016/08/14 14:42:22 skrll Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $	*/
 
 /*
@@ -295,10 +295,11 @@ struct usbif_attach_arg {
  *
  * Eventually, IPL_USB can/should be changed
  */
-#define splusb splsoftnet
-#define splhardusb splvm
-#define IPL_SOFTUSB IPL_SOFTNET
 #define IPL_USB IPL_VM
-#define SOFTINT_USB SOFTINT_NET
+#define splhardusb splvm
+
+#define SOFTINT_USB SOFTINT_SERIAL
+#define IPL_SOFTUSB IPL_SOFTSERIAL
+#define splusb splsoftserial
 
 #endif /* _USBDI_H_ */

Index: src/sys/external/bsd/dwc2/dwc2.c
diff -u src/sys/external/bsd/dwc2/dwc2.c:1.43 src/sys/external/bsd/dwc2/dwc2.c:1.44
--- src/sys/external/bsd/dwc2/dwc2.c:1.43	Fri May  6 13:03:06 2016
+++ src/sys/external/bsd/dwc2/dwc2.c	Sun Aug 14 14:42:22 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: dwc2.c,v 1.43 2016/05/06 13:03:06 skrll Exp $	*/
+/*	$NetBSD: dwc2.c,v 1.44 2016/08/14 14:42:22 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.43 2016/05/06 13:03:06 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.44 2016/08/14 14:42:22 skrll Exp $");
 
 #include "opt_usb.h"
 
@@ -1264,7 +1264,7 @@ dwc2_init(struct dwc2_softc *sc)
 
 	TAILQ_INIT(&sc->sc_complete);
 
-	sc->sc_rhc_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
+	sc->sc_rhc_si = softint_establish(SOFTINT_USB | SOFTINT_MPSAFE,
 	    dwc2_rhc, sc);
 
 	sc->sc_xferpool = pool_cache_init(sizeof(struct dwc2_xfer), 0, 0, 0,

Reply via email to