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,