On Fri, 12 Sep 2014, Petr Mladek wrote: > usb_autopm_put_interface() must be called only when usb_autopm_get_interface() > succeeded before. There was wrong ordering of the goto targets. No, you are wrong. The code is correct as it stands. > The funny thing is that the names of the goto targets and the related comments > were correct. That's because the whole thing is correct. Go back and read the comments more carefully -- especially the comment following the "loop:" label. > Signed-off-by: Petr Mladek <pmladek@xxxxxxx> > --- > drivers/usb/core/hub.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index d481c99a20d7..6afd79ee3340 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -5132,12 +5132,12 @@ static void hub_events(void) > > loop_autopm: > /* Balance the usb_autopm_get_interface() above */ > - usb_autopm_put_interface_no_suspend(intf); > + usb_autopm_put_interface(intf); There's no point to this change. Now this call will decrement the usage counter and try to suspend -- but the suspend is bound to fail because the usage counter is still > 0. > loop: > /* Balance the usb_autopm_get_interface_no_resume() in > * kick_khubd() and allow autosuspend. > */ > - usb_autopm_put_interface(intf); > + usb_autopm_put_interface_no_suspend(intf); And now this call will decrement the usage counter down to 0, but won't try to suspend -- so the hub won't autosuspend at all! > loop_disconnected: > usb_unlock_device(hdev); > usb_put_dev(hdev); Alan Stern -- 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