USB: cdc-acm: fix deadlock in acm_tty_open
The mutex must be dropped before calling usb_autopm_interface_put,
else a concurrent call to acm_suspend will trigger a deadlock.
BUG=chrome-os-partner:3143
TEST=run power_Resume test in tight loops on Alex.
Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Review URL: http://codereview.chromium.org/6824041
Change-Id: I35633cfd0aad8f9b3d72c83aefb25e2ed46e1a08
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index fc74de7..a98e38893 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -587,8 +587,6 @@
(acm->ctrl_caps & USB_CDC_CAP_LINE))
goto full_bailout;
- usb_autopm_put_interface(acm->control);
-
INIT_LIST_HEAD(&acm->spare_read_urbs);
INIT_LIST_HEAD(&acm->spare_read_bufs);
INIT_LIST_HEAD(&acm->filled_read_bufs);
@@ -605,6 +603,7 @@
tasklet_schedule(&acm->urb_task);
mutex_unlock(&acm->mutex);
+ usb_autopm_put_interface(acm->control);
out:
mutex_unlock(&open_mutex);
return rv;