Re: [PATCH v9 15/19] usb: introduce port status lock

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

 



On Wed, 7 May 2014, Dan Williams wrote:

> In general we do not want khubd to act on port status changes that are
> the result of in progress resets or USB runtime PM operations.
> Specifically port power control testing has been able to trigger an
> unintended disconnect in hub_port_connect_change(), paraphrasing:
> 
> 	if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&
> 	    udev->state != USB_STATE_NOTATTACHED) {
> 		if (portstatus & USB_PORT_STAT_ENABLE) {
> 			/* Nothing to do */
> 		} else if (udev->state == USB_STATE_SUSPENDED &&
> 				udev->persist_enabled) {
> 			...
> 		} else {
> 			/* Don't resuscitate */;
> 		}
> 	}
> 
> ...by falling to the "Don't resuscitate" path or missing
> USB_PORT_STAT_CONNECTION because usb_port_resume() was in the middle of
> modifying the port status.
> 
> So, we want a new lock to hold off khubd for a given port while the
> child device is being suspended, resumed, or reset.  The lock ordering
> rules are now usb_lock_device() => usb_lock_port().  This is mandated by
> the device core which may hold the device_lock on the usb_device before
> invoking usb_port_{suspend|resume} which in turn take the status_lock on
> the usb_port.  We attempt to hold the status_lock for the duration of a
> port_event() run, and drop/re-acquire it when needing to take the
> device_lock.  The lock is also dropped/re-acquired during
> hub_port_reconnect().
> 
> This patch also deletes hub->busy_bits as all use cases are now covered
> by port PM runtime synchronization or the port->status_lock and it
> pushes down usb_device_lock() into usb_remote_wakeup().
> 
> Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>

Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




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

  Powered by Linux