aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorJoe Peterson <joe@skyrush.com>2009-01-02 08:40:53 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-02 13:19:35 -0500
commita88a69c91256418c5907c2f1f8a0ec0a36f9e6cc (patch)
treecc595c2c67b1d070e6897bac4098702c164feb39 /include/linux
parente482a2378f3d1aef7fa8942f8f163078f01bb456 (diff)
n_tty: Fix loss of echoed characters and remove bkl from n_tty
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: Joe Peterson <joe@skyrush.com> Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/tty.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 3f4954c55e53..dfc77ded198a 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -253,6 +253,7 @@ struct tty_struct {
253 unsigned int column; 253 unsigned int column;
254 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1; 254 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
255 unsigned char closing:1; 255 unsigned char closing:1;
256 unsigned char echo_overrun:1;
256 unsigned short minimum_to_wake; 257 unsigned short minimum_to_wake;
257 unsigned long overrun_time; 258 unsigned long overrun_time;
258 int num_overrun; 259 int num_overrun;
@@ -262,11 +263,16 @@ struct tty_struct {
262 int read_tail; 263 int read_tail;
263 int read_cnt; 264 int read_cnt;
264 unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))]; 265 unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))];
266 unsigned char *echo_buf;
267 unsigned int echo_pos;
268 unsigned int echo_cnt;
265 int canon_data; 269 int canon_data;
266 unsigned long canon_head; 270 unsigned long canon_head;
267 unsigned int canon_column; 271 unsigned int canon_column;
268 struct mutex atomic_read_lock; 272 struct mutex atomic_read_lock;
269 struct mutex atomic_write_lock; 273 struct mutex atomic_write_lock;
274 struct mutex output_lock;
275 struct mutex echo_lock;
270 unsigned char *write_buf; 276 unsigned char *write_buf;
271 int write_cnt; 277 int write_cnt;
272 spinlock_t read_lock; 278 spinlock_t read_lock;