• Dirkjan Bussink's avatar
    tty: Prevent deadlock in n_gsm driver · 4d9b1090
    Dirkjan Bussink authored
    This change fixes a deadlock when the multiplexer is closed while there
    are still client side ports open.
    
    When the multiplexer is closed and there are active tty's it tries to
    close them with tty_vhangup. This has a problem though, because
    tty_vhangup needs the tty_lock. This patch changes it to unlock the
    tty_lock before attempting the hangup and relocks afterwards. The
    additional call to tty_port_tty_set is needed because otherwise the
    port stays active because of the reference counter.
    
    This change also exposed another problem that other code paths don't
    expect that the multiplexer could have been closed. This patch also adds
    checks for these cases in the gsmtty_ class of function that could be
    called.
    
    The documentation explicitly states that "first close all virtual ports
    before closing the physical port" but we've found this to not always
    reality in our field situations. The GPRS / UTMS modem sometimes crashes
    and needs a power cycle in that case which means cleanly shutting down
    everything is not always possible. This change makes it much more robust
    for our situation where at least the system is recoverable with this patch
    and doesn't hang in a deadlock situation inside the kernel.
    
    The patch is against the long term support kernel (3.4.27) and should
    apply cleanly to more recent branches. Tested with a Telit GE864-QUADV2
    and Telit HE910 modem.
    Signed-off-by: default avatarDirkjan Bussink <dirkjan.bussink@nedap.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4d9b1090
n_gsm.c 78.6 KB