Re: [PATCH v9 17/19] usb: resume (wakeup) child device when port is powered on

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

 



[ adding Greg to the cc as a ping and in case he was curious of the
current review state of this patchset ]

On Thu, May 15, 2014 at 12:41 PM, Dan Williams <dan.j.williams@xxxxxxxxx> wrote:
> On Mon, 2014-05-12 at 15:14 -0400, Alan Stern wrote:
>> On Mon, 12 May 2014, Dan Williams wrote:
>>
>> > Fixed.  And dropped "wakeup" out of the patch subject.
>> >
>> > > There's a nasty bug here.  I'll let you figure it out for yourself.  :-)
>> > > Hint: Hiding a variable by declaring another local variable with the
>> > > same name in an inner block often leads to trouble.
>> >
>> > Added hub_disconnect_children() and a note in the changelog.
>> >
>> > 8<---------
>> > Subject: usb: resume child device when port is powered on
>> >
>> > From: Dan Williams <dan.j.williams@xxxxxxxxx>
>> >
>> > Unconditionally wake up the child device when the power session is
>> > recovered.
>> >
>> > This addresses the following scenarios:
>> >
>> > 1/ The device may need a reset on power-session loss, without this
>> >    change port power-on recovery exposes khubd to scenarios that
>> >    usb_port_resume() is set to handle.  Prior to port power control the
>> >    only time a power session would be lost is during dpm_suspend of the
>> >    hub.  In that scenario usb_port_resume() is guaranteed to be called
>> >    prior to khubd running for that port.  With this change we wakeup the
>> >    child device as soon as possible (prior to khubd running again for this
>> >    port).
>> >
>> >    Although khubd has facilities to wake a child device it will only do
>> >    so if the portstatus / portchange indicates a suspend state.  In the
>> >    case of port power control we are not coming from a hub-port-suspend
>> >    state.  This implementation simply uses pm_request_resume() to wake the
>> >    device and relies on the port_dev->status_lock to prevent any collisions
>> >    between khubd and usb_port_resume().
>> >
>> > 2/ This mechanism rate limits port power toggling.  The minimum port
>> >    power on/off period is now gated by the child device suspend/resume
>> >    latency.  Empirically this mitigates devices downgrading their connection
>> >    on perceived instability of the host connection.  This ratelimiting is
>> >    really only relevant to port power control testing, but it is a nice
>> >    side effect of closing the above race.  Namely, the race of khubd for
>> >    the given port running while a usb_port_resume() event is pending.
>> >
>> > 3/ Going forward we are finding that power-session recovery requires
>> >    warm-resets (http://marc.info/?t=138659232900003&r=1&w=2).  This
>> >    mechanism allows for warm-resets to be requested at the same point in
>> >    the resume path for hub dpm_suspend power session losses, or port
>> >    rpm_suspend power session losses.
>> >
>> > 4/ If the device *was* disconnected the only time we'll know for sure is
>> >    after a failed resume, so it's necessary for usb_port_runtime_resume()
>> >    to expedite a usb_port_resume() to clean up the removed device.  The
>> >    reasoning for this is "least surprise" for the user. Turning on a port
>> >    means that hotplug detection is again enabled for the port, it is
>> >    surprising that devices that were removed while the port was off are not
>> >    disconnected until they are attempted to be used.  As a user "why would
>> >    I try to use a device I removed from the system?"
>> >
>> > 1, 2, and 4 are not a problem in the system dpm_resume() case because,
>> > although the power-session is lost, khubd is frozen until after device
>> > resume.  For the rpm_resume() case pm_request_resume() is used to
>> > request re-validation of the device, and if it happens to collide with a
>> > khubd run we rely on the port_dev->status_lock to synchronize those
>> > operations.
>> >
>> > Besides testing, the primary scenario where this mechanism is expected
>> > to be triggered is when the user changes the port power policy
>> > (control/pm_qos_no_poweroff, or power/control).   Each time power is
>> > enabled want to revalidate the child device, where the revalidation is
>> > handled by usb_port_resume().
>> >
>> > Given that this arranges for port_dev->child to be de-referenced in
>> > usb_port_runtime_resume() we need to make sure not to collide with
>> > usb_disconnect() that frees the usb_device.  To this end we hold the
>> > port active with the "child_usage" reference across the disconnect
>> > event.  Subsequently, the need to access hub->child_usage_bits lead to
>> > the creation of hub_disconnect_children() to remove any ambiguity of
>> > which "hub" is being acted on in usb_disconnect() (prompted-by sharp
>> > eyes from Alan).
>> >
>> > Cc: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx>
>> > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx>
>>
>> This version looks good.
>>
>> Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
>>
>> Is that everything?  Or did we skip a few patches in the middle?  It's
>> hard to keep track.
>
> Sorry for the delay had some medically induced latency earlier this
> week, feeling better.  My ack tracker script currently says:
>
> ACK [01/19] USB: mutual exclusion for resetting a hub and power-managing a port
> ACK [02/19] usb: disable port power control if not supported in wHubCharacteristics
> ACK [03/19] usb: rename usb_port device objects
> ACK [04/19] usb: cleanup setting udev->removable from port_dev->connect_type
> ACK [05/19] usb: assign default peer ports for root hubs
> ACK [06/19] usb: assign usb3 external hub port peers
> ACK [07/19] usb: find internal hub tier mismatch via acpi
> ACK [08/19] usb: sysfs link peer ports
>     [09/19] usb: make usb_port flags atomic, rename did_runtime_put to child_usage
> ACK [10/19] usb: block suspension of superspeed port while hispeed peer is active
> ACK [11/19] usb: don't clear FEAT_C_ENABLE on usb_port_runtime_resume failure
> ACK [12/19] usb: usb3 ports do not support FEAT_C_ENABLE
>     [13/19] usb: refactor port handling in hub_events()
>     [14/19] usb: synchronize port poweroff and khubd
>     [15/19] usb: introduce port status lock
> ACK [16/19] usb: hub_handle_remote_wakeup() depends on CONFIG_PM_RUNTIME=y
> ACK [17/19] usb: resume child device when port is powered on
> ack [18/19] usb: force warm reset to break link re-connect livelock
>     [19/19] usb: documentation for usb port power off mechanisms
>
> ...where that lower case "ack" means acked, but not by you.
>
--
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