All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang YanQing <udknight@gmail.com>
To: gregkh@linuxfoundation.org
Cc: jslaby@suse.cz, linux-kernel@vger.kernel.org
Subject: [PATCH]TTY: Fix tty can't be restarted by TCXONC ioctl request
Date: Wed, 8 May 2013 02:47:34 +0800	[thread overview]
Message-ID: <20130507184734.GA2459@udknight> (raw)

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.
But after search the emacs's startup codes, I find they use TCXONC
to workaround this situation:

  /* This code added to insure that, if flow-control is not to be used,
     we have an unlocked terminal at the start. */
  if (!tty_out->flow_control) ioctl (fileno (tty_out->input), TCXONC, 1);
  ioctl (fileno (tty_out->input), TCXONC, 1);

But this workaround never work due the kernel's current code.
This patch fix it.

Below is the ChangeLog introduce the tty->flow_stopped flag:

Thu Nov 21 10:05:22 1996  Theodre Ts'o  <tytso@localhost.mit.edu>

       * tty_ioctl.c (tty_wait_until_sent): Always check the driver
               wait_until_ready routine, even if there are no characters
               in the xmit buffer.  (There may be charactes in the device
               FIFO.)
               (n_tty_ioctl): Add new flag tty->flow_stopped which
               indicates whether the tty is stopped due to a request by
               the TCXONC ioctl (used by tcflow).  If so, don't let an
               incoming XOFF character restart the tty.  The tty can only
               be restarted by another TCXONC request.

So I think this patch make TCXONC can restart tty which stopped by
STOP_CHAR don't break the original meaning.

This patch will fix some strange tty relation hang problem,
I believe I meet it with vim in ssh, and also see below bug report:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=465823

Signed-off-by: Wang YanQing <udknight@gmail.com>
---
 drivers/tty/tty_ioctl.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c
index e4455e0..42e08e5 100644
--- a/drivers/tty/tty_ioctl.c
+++ b/drivers/tty/tty_ioctl.c
@@ -1129,11 +1129,12 @@ int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
 		case TCOOFF:
 			if (!tty->flow_stopped) {
 				tty->flow_stopped = 1;
-				stop_tty(tty);
+				if (!tty->stopped)
+					stop_tty(tty);
 			}
 			break;
 		case TCOON:
-			if (tty->flow_stopped) {
+			if (tty->flow_stopped || tty->stopped) {
 				tty->flow_stopped = 0;
 				start_tty(tty);
 			}
-- 
1.7.12.4.dirty

             reply	other threads:[~2013-05-07 18:47 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-07 18:47 Wang YanQing [this message]
2013-05-07 18:58 ` [PATCH]TTY: Fix tty can't be restarted by TCXONC ioctl request Greg KH
2013-05-08  1:55   ` Wang YanQing
2013-05-08  2:02     ` Greg KH
2013-05-08 13:16       ` Wang YanQing
2013-05-08 15:18         ` Peter Hurley
2013-05-08 17:12           ` Wang YanQing
2013-05-08 18:32             ` Peter Hurley
2013-05-09  0:42               ` Wang YanQing
2013-05-07 20:50 ` Peter Hurley
2013-05-08  2:00   ` Wang YanQing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130507184734.GA2459@udknight \
    --to=udknight@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.