NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/53447: usb lock problem, mutex_enter



The following reply was made to PR kern/53447; it has been noted by GNATS.

From: christos%zoulas.com@localhost (Christos Zoulas)
To: gnats-bugs%NetBSD.org@localhost, kern-bug-people%netbsd.org@localhost, 
	gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Cc: 
Subject: Re: kern/53447: usb lock problem, mutex_enter
Date: Thu, 12 Jul 2018 17:51:34 -0400

 On Jul 12,  9:25pm, phil%netbsd.org@localhost (phil%netbsd.org@localhost) wrote:
 -- Subject: kern/53447: usb lock problem, mutex_enter
 
 | >Number:         53447
 | >Category:       kern
 | >Synopsis:       usb lock problem, mutex_enter
 | >Confidential:   no
 | >Severity:       serious
 | >Priority:       medium
 | >Responsible:    kern-bug-people
 | >State:          open
 | >Class:          sw-bug
 | >Submitter-Id:   net
 | >Arrival-Date:   Thu Jul 12 21:25:00 +0000 2018
 | >Originator:     Phil Nelson
 | >Release:        NetBSD HEAD 8.99.21
 | >Organization:
 | >Environment:
 | 8.99.21 NetBSD 8.99.21 (STEELHEAD) #8: Thu Jul 12 13:34:13 PDT 2018 amd64
 | >Description:
 | When asking for the root device using a USB console keyboard, typing a character to answer the root device name causes a Mutex_error, mutex_vector_enter 528: spin lock held.
 
 Try this:
 
 Index: xhci.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/usb/xhci.c,v
 retrieving revision 1.93
 diff -u -u -r1.93 xhci.c
 --- xhci.c	29 Jun 2018 17:48:24 -0000	1.93
 +++ xhci.c	12 Jul 2018 21:50:51 -0000
 @@ -1206,7 +1206,7 @@
  static inline bool
  xhci_polling_p(struct xhci_softc * const sc)
  {
 -	return sc->sc_bus.ub_usepolling || sc->sc_bus2.ub_usepolling;
 +	return cold || sc->sc_bus.ub_usepolling || sc->sc_bus2.ub_usepolling;
  }
  
  int
 @@ -3983,6 +3983,7 @@
  	struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
  	struct xhci_xfer * const xx = XHCI_XFER2XXFER(xfer);
  	const uint32_t len = xfer->ux_length;
 +	const bool polling = xhci_polling_p(sc);
  	usb_dma_t * const dma = &xfer->ux_dmabuf;
  	uint64_t parameter;
  	uint32_t status;
 @@ -4009,13 +4010,15 @@
  	    XHCI_TRB_3_IOC_BIT;
  	xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
  
 -	mutex_enter(&tr->xr_lock);
 +	if (!polling)
 +		mutex_enter(&tr->xr_lock);
  	xhci_ring_put(sc, tr, xfer, xx->xx_trb, i);
 -	mutex_exit(&tr->xr_lock);
 +	if (!polling)
 +		mutex_exit(&tr->xr_lock);
  
  	xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci);
  
 -	if (xfer->ux_timeout && !xhci_polling_p(sc)) {
 +	if (xfer->ux_timeout && !polling) {
  		callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout),
  		    xhci_timeout, xfer);
  	}
 


Home | Main Index | Thread Index | Old Index