linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-serial@vger.kernel.org
Cc: Jiri Slaby <jslaby@suse.cz>,
	Dave Young <hidave.darkstar@gmail.com>,
	Dave Jones <davej@redhat.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	Dmitriy Matrosov <sgf.dma@gmail.com>,
	Alan Cox <alan@lxorguk.ukuu.org.uk>,
	stable <stable@vger.kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 13/13] TTY: ldisc, wait for ldisc infinitely in hangup
Date: Mon, 21 Nov 2011 17:11:43 -0800	[thread overview]
Message-ID: <1321924303-26475-13-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <1321924303-26475-1-git-send-email-gregkh@suse.de>

From: Jiri Slaby <jslaby@suse.cz>

For /dev/console case, we do not kill all ldisc users. It's due to
redirected_tty_write test in __tty_hangup. In that case there still
might be a process waiting e.g. in n_tty_read for input.

We wait for such processes to disappear. The problem is that we use a
timeout. After this timeout, we continue closing the ldisc and start
freeing tty resources. It obviously leads to crashes when the other
process is woken.

So to fix this, we wait infinitely before reiniting the ldisc. (The
tiocsetd remains untouched -- times out after 5s.)

This is nicely reproducible with this run from shell:
  exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
and stopping a getty like:
  systemctl stop serial-getty@ttyS0.service

The crash proper may be produced only under load or with constified
timing the same as for 92f6fa09b.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Dave Young <hidave.darkstar@gmail.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Ben Hutchings <ben@decadent.org.uk>
Cc: Dmitriy Matrosov <sgf.dma@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/tty/tty_ldisc.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index a69a755..8e0924f 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -36,6 +36,7 @@
 
 #include <linux/kmod.h>
 #include <linux/nsproxy.h>
+#include <linux/ratelimit.h>
 
 /*
  *	This guards the refcounted line discipline lists. The lock
@@ -837,7 +838,7 @@ void tty_ldisc_hangup(struct tty_struct *tty)
 	tty_unlock();
 	cancel_work_sync(&tty->buf.work);
 	mutex_unlock(&tty->ldisc_mutex);
-
+retry:
 	tty_lock();
 	mutex_lock(&tty->ldisc_mutex);
 
@@ -846,7 +847,21 @@ void tty_ldisc_hangup(struct tty_struct *tty)
 	   it means auditing a lot of other paths so this is
 	   a FIXME */
 	if (tty->ldisc) {	/* Not yet closed */
-		WARN_ON_ONCE(tty_ldisc_wait_idle(tty, 5 * HZ));
+		if (atomic_read(&tty->ldisc->users) != 1) {
+			char cur_n[TASK_COMM_LEN], tty_n[64];
+			long timeout = 3 * HZ;
+			tty_unlock();
+
+			while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) {
+				timeout = MAX_SCHEDULE_TIMEOUT;
+				printk_ratelimited(KERN_WARNING
+					"%s: waiting (%s) for %s took too long, but we keep waiting...\n",
+					__func__, get_task_comm(cur_n, current),
+					tty_name(tty, tty_n));
+			}
+			mutex_unlock(&tty->ldisc_mutex);
+			goto retry;
+		}
 
 		if (reset == 0) {
 
-- 
1.7.7.3


      parent reply	other threads:[~2011-11-22  1:12 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-22  0:59 [GIT PATCH] TTY/serial driver fixes for 3.2 Greg KH
2011-11-22  1:11 ` [PATCH 01/13] jsm: Change maintainership Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 02/13] tty: hvc_dcc: Fix duplicate character inputs Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 03/13] pch_uart: Fix hw-flow control issue Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 04/13] pch_uart: Support new device LAPIS Semiconductor ML7831 IOH Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 05/13] pch_uart: Change company name OKI SEMICONDUCTOR to LAPIS Semiconductor Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 06/13] tty/serial: Prevent drop of DCD on suspend for Tegra UARTs Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 07/13] serial,mfd: Fix CMSPAR setup Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 08/13] pch_uart: Fix DMA resource leak issue Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 09/13] RS485: fix inconsistencies in the meaning of some variables Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 10/13] Revert "tty/serial: Prevent drop of DCD on suspend for Tegra UARTs" Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 11/13] TTY: ldisc, allow waiting for ldisc arbitrarily long Greg Kroah-Hartman
2011-11-22  1:11   ` [PATCH 12/13] TTY: ldisc, move wait idle to caller Greg Kroah-Hartman
2011-11-22  1:11   ` Greg Kroah-Hartman [this message]

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=1321924303-26475-13-git-send-email-gregkh@suse.de \
    --to=gregkh@suse.de \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=ben@decadent.org.uk \
    --cc=davej@redhat.com \
    --cc=hidave.darkstar@gmail.com \
    --cc=jslaby@suse.cz \
    --cc=linux-serial@vger.kernel.org \
    --cc=sgf.dma@gmail.com \
    --cc=stable@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).