• Joe Peterson's avatar
    n_tty: Fix loss of echoed characters and remove bkl from n_tty · a88a69c9
    Joe Peterson authored
    Fixes the loss of echoed (and other ldisc-generated characters) when
    the tty is stopped or when the driver output buffer is full (happens
    frequently for input during continuous program output, such as ^C)
    and removes the Big Kernel Lock from the N_TTY line discipline.
    
    Adds an "echo buffer" to the N_TTY line discipline that handles all
    ldisc-generated output (including echoed characters).  Along with the
    loss of characters, this also fixes the associated loss of sync between
    tty output and the ldisc state when characters cannot be immediately
    written to the tty driver.
    
    The echo buffer stores (in addition to characters) state operations that need
    to be done at the time of character output (like management of the column
    position).  This allows echo to cooperate correctly with program output,
    since the ldisc state remains consistent with actual characters written.
    
    Since the echo buffer code now isolates the tty column state code
    to the process_out* and process_echoes functions, we can remove the
    Big Kernel Lock (BKL) and replace it with mutex locks.
    
    Highlights are:
    
    * Handles echo (and other ldisc output) when tty driver buffer is full
      - continuous program output can block echo
    * Saves echo when tty is in stopped state (e.g. ^S)
      - (e.g.: ^Q will correctly cause held characters to be released for output)
    * Control character pairs (e.g. "^C") are treated atomically and not
      split up by interleaved program output
    * Line discipline state is kept consistent with characters sent to
      the tty driver
    * Remove the big kernel lock (BKL) from N_TTY line discipline
    Signed-off-by: default avatarJoe Peterson <joe@skyrush.com>
    Signed-off-by: default avatarAlan Cox <alan@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a88a69c9
vt.c 98 KB