USB: cdc-acm: Fix potential deadlock (lockdep warning)
authorHavard Skinnemoen <hskinnemoen@google.com>
Wed, 30 Nov 2011 21:28:14 +0000 (13:28 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 10 Dec 2011 00:18:18 +0000 (16:18 -0800)
commit7fb57a019f94ea0c1290c39b8da753be155af41c
tree58e93fc2b2bd2e6656bbde2cc9e068a1ffe31b10
parent332ceddb8c4ba2367abcb9a94a69386b2785441b
USB: cdc-acm: Fix potential deadlock (lockdep warning)

Rework the locking and lifecycle management in the cdc-acm driver.
Instead of using a global mutex to prevent the 'acm' object from being
freed, use the tty_port kref to keep the device alive when either the
USB side or TTY side is still active.

This allows us to use the global mutex purely for protecting the
acm_table, while use acm->mutex to guard against disconnect during
TTY port activation and shutdown.

The USB-side kref is taken during port initialization in probe(), and
released at the end of disconnect(). The TTY-side kref is taken in
install() and released in cleanup(). On disconnect, tty_vhangup() is
called instead of tty_hangup() to ensure the TTY hangup processing is
completed before the USB device is taken down.

The TTY open and close handlers have been gutted and replaced with
tty_port_open() and tty_port_close() respectively. The driver-specific
code which used to be there was spread across install(), activate() and
shutdown().

Reported-by: Dave Jones <davej@redhat.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/class/cdc-acm.c
drivers/usb/class/cdc-acm.h