RE: [PATCH 3/3] xhci: Don't create stream debugfs files with spinlock held.

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

 




> -----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





[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux