Skip to content
  • Peter Hurley's avatar
    tty: Remove tty_wait_until_sent_from_close() · 79c1faa4
    Peter Hurley authored
    tty_wait_until_sent_from_close() drops the tty lock while waiting
    for the tty driver to finish sending previously accepted data (ie.,
    data remaining in its write buffer and transmit fifo).
    
    tty_wait_until_sent_from_close() was added by commit a57a7bf3
    ("TTY: define tty_wait_until_sent_from_close") to prevent the entire
    tty subsystem from being unable to open new ttys while waiting for
    one tty to close while output drained.
    
    However, since commit 0911261d
    
     ("tty: Don't take tty_mutex for tty
    count changes"), holding a tty lock while closing does not prevent other
    ttys from being opened/closed/hung up, but only prevents lifetime event
    changes for the tty under lock.
    
    Holding the tty lock while waiting for output to drain does prevent
    parallel non-blocking opens (O_NONBLOCK) from advancing or returning
    while the tty lock is held. However, all parallel opens _already_
    block even if the tty lock is dropped while closing and the parallel
    open advances. Blocking in open has been in mainline since at least 2.6.29
    (see tty_port_block_til_ready(); note the test for O_NONBLOCK is _after_
    the wait while ASYNC_CLOSING).
    
    IOW, before this patch a non-blocking open will sleep anyway for the
    _entire_ duration of a parallel hardware shutdown, and when it wakes, the
    error return will cause a release of its tty, and it will restart with
    a fresh attempt to open. Similarly with a blocking open that is already
    waiting; when it's woken, the hardware shutdown has already completed
    to ASYNC_INITIALIZED is not set, which forces a release and restart as
    well.
    
    So, holding the tty lock across the _entire_ close (which is what this
    patch does), even while waiting for output to drain, is equivalent to
    the current outcome wrt parallel opens.
    
    Cc: Alan Cox <alan@linux.intel.com>
    Cc: David Laight <David.Laight@aculab.com>
    CC: Arnd Bergmann <arnd@arndb.de>
    CC: Karsten Keil <isdn@linux-pingi.de>
    CC: linuxppc-dev@lists.ozlabs.org
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    79c1faa4