Patchwork [3.5.y.z,extended,stable] Patch "TTY: Fix tty miss restart after we turn off flow-control" has been added to staging queue

mail settings
Submitter Luis Henriques
Date May 28, 2013, 9:51 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/246784/
State New
Headers show


Luis Henriques - May 28, 2013, 9:51 a.m.
This is a note to let you know that I have just added a patch titled

    TTY: Fix tty miss restart after we turn off flow-control

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 871f1f47995e6724b742f5bacb86111aee56523a Mon Sep 17 00:00:00 2001
From: Wang YanQing <>
Date: Thu, 9 May 2013 14:16:47 +0800
Subject: [PATCH] TTY: Fix tty miss restart after we turn off flow-control

commit dab73b4eb9ef924a2b90dab84e539076d82b256f upstream.

I meet emacs hang in start if I do the operation below:
  1: echo 3 > /proc/sys/vm/drop_caches
  2: emacs BigFile
  3: Press CTRL-S follow 2 immediately

Then emacs hang on, CTRL-Q can't resume, the terminal
hang on, you can do nothing with this terminal except
close it.

The reason is before emacs takeover control the tty,
we use CTRL-S to XOFF it. Then when emacs takeover the
control, it may don't use the flow-control, so emacs hang.
This patch fix it.

This patch will fix a kind of strange tty relation hang problem,
I believe I meet it with vim in ssh, and also see below bug report:

Signed-off-by: Wang YanQing <>
Signed-off-by: Greg Kroah-Hartman <>
[ luis: adjust context ]
Signed-off-by: Luis Henriques <>
 drivers/tty/n_tty.c | 8 ++++++++
 1 file changed, 8 insertions(+)



diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index 26f0d0e..72d3ff8 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -1529,6 +1529,14 @@  static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
 			tty->real_raw = 0;
+	/*
+	 * Fix tty hang when I_IXON(tty) is cleared, but the tty
+	 * been stopped by STOP_CHAR(tty) before it.
+	 */
+	if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
+		start_tty(tty);
+	}
 	/* The termios change make the tty ready for I/O */