> -----Original Message----- > From: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> > Sent: Thursday, October 29, 2020 4:31 AM > To: gregkh@xxxxxxxxxxxxxxxxxxx > Cc: linux-usb@xxxxxxxxxxxxxxx; Mathias Nyman > <mathias.nyman@xxxxxxxxxxxxxxx>; Hans de Goede <hdegoede@xxxxxxxxxx>; Mike > Galbraith <efault@xxxxxx>; Jun Li <jun.li@xxxxxxx> > Subject: [PATCH 3/3] xhci: Don't create stream debugfs files with spinlock > held. > > Creating debugfs files while loding the spin_lock_irqsave(xhci->lock) > creates a lock dependecy that could possibly deadlock. > > Lockdep warns: > > ===================================================== > WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected > 5.10.0-rc1pdx86+ #8 Not tainted > ----------------------------------------------------- > systemd-udevd/386 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire: > ffffffffb1a94038 (pin_fs_lock){+.+.}-{2:2}, at: simple_pin_fs+0x22/0xa0 > > and this task is already holding: > ffff9e7b87fbc430 (&xhci->lock){-.-.}-{2:2}, at: > xhci_alloc_streams+0x5f9/0x810 which would create a new lock dependency: > (&xhci->lock){-.-.}-{2:2} -> (pin_fs_lock){+.+.}-{2:2} > > Create the files a bit later after lock is released. > > Reported-by: Hans de Goede <hdegoede@xxxxxxxxxx> > Reported-by: Mike Galbraith <efault@xxxxxx> > Tested-by: Hans de Goede <hdegoede@xxxxxxxxxx> > CC: Li Jun <jun.li@xxxxxxx> > Fixes: 673d74683627 ("usb: xhci: add debugfs support for ep with stream") > Signed-off-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> Reviewed-and-tested-by: Li Jun <jun.li@xxxxxxx> > --- > drivers/usb/host/xhci.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index > 482fe8c5e3b4..d4a8d0efbbc4 100644 > --- a/drivers/usb/host/xhci.c > +++ b/drivers/usb/host/xhci.c > @@ -3533,11 +3533,14 @@ static int xhci_alloc_streams(struct usb_hcd *hcd, > struct usb_device *udev, > xhci_dbg(xhci, "Slot %u ep ctx %u now has streams.\n", > udev->slot_id, ep_index); > vdev->eps[ep_index].ep_state |= EP_HAS_STREAMS; > - xhci_debugfs_create_stream_files(xhci, vdev, ep_index); > } > xhci_free_command(xhci, config_cmd); > spin_unlock_irqrestore(&xhci->lock, flags); > > + for (i = 0; i < num_eps; i++) { > + ep_index = xhci_get_endpoint_index(&eps[i]->desc); > + xhci_debugfs_create_stream_files(xhci, vdev, ep_index); > + } > /* Subtract 1 for stream 0, which drivers can't use */ > return num_streams - 1; > > -- > 2.25.1