• Havard Skinnemoen's avatar
    USB: cdc-acm: Fix potential deadlock (lockdep warning) · 7fb57a01
    Havard Skinnemoen authored
    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: default avatarDave Jones <davej@redhat.com>
    Cc: Alan Cox <alan@linux.intel.com>
    Cc: Jiri Slaby <jslaby@suse.cz>
    Signed-off-by: default avatarHavard Skinnemoen <hskinnemoen@google.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    7fb57a01
cdc-acm.c 45.5 KB