• Paul Fulghum's avatar
    n_hdlc: fix read and write locking · 1035b63d
    Paul Fulghum authored
    Fix locking in read and write code of n_hdlc line discipline.
    
    2.6.36 replaced lock_kernel() with tty_lock().  The tty mutex is not
    dropped automatically when the thread sleeps like the BKL.  This results
    in a blocked read or write holding the tty mutex and stalling operations
    by other devices that use the tty mutex.
    
    A review of n_hdlc read and write code shows:
    1. neither BKL or tty mutex are required for correct operation
    2. read can block while read data is available if data is posted
       between availability check and call to interruptible_sleep_on()
    3. write does not set process state to TASK_INTERRUPTIBLE
       on each pass through the processing loop which can cause
       unneeded scheduling of the thread
    
    The unnecessary tty mutex references have been removed.
    
    Read changed to use same code as n_tty read
    for completing reads and blocking.
    
    Write corrected to set process state to TASK_INTERRUPTIBLE on each pass
    through processing loop.
    Signed-off-by: default avatarPaul Fulghum <paulkf@microgate.com>
    Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    1035b63d
n_hdlc.c 27.3 KB