From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
"Rafael J. Wysocki" <rjw@sisk.pl>, Ray Lee <ray-lk@madrabbit.org>,
LKML <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [Regression] kdesu broken
Date: Sun, 26 Jul 2009 20:51:37 +0900 [thread overview]
Message-ID: <87bpn7mzli.fsf@devron.myhome.or.jp> (raw)
In-Reply-To: <20090725163251.50e6f546@lxorguk.ukuu.org.uk> (Alan Cox's message of "Sat, 25 Jul 2009 16:32:51 +0100")
Alan Cox <alan@lxorguk.ukuu.org.uk> writes:
> Good to know the initial fix works. To actually do it cleanly probably
> wants a way to pass a logical channel close through the tty layer which
> isn't I think too hard
>
> set a new TTY_OTHER_CLOSING in the pty code
> set TTY_OTHER_CLOSED in the flip_buffer_push code if we empty the
> buffer queue and TTY_OTHER_CLOSING is set.
>
> That would also avoid using tty->low_latency=1 in the pty layer which I
> worry may harm PPP gateway performance and the like.
I see. It sounds like good thing. The attached patch or something?
Anyway, I'm not familiar with the tty stuff obviously, so, I'm not sure
whether this patch is right or not.
If needed, I'll test the new patch.
Thanks.
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---
drivers/char/pty.c | 19 ++++++++++++++++---
drivers/char/tty_buffer.c | 28 ++++++++++++++++++++++++++--
include/linux/tty.h | 13 +++++++------
3 files changed, 49 insertions(+), 11 deletions(-)
diff -puN drivers/char/pty.c~pty-fixes2 drivers/char/pty.c
--- linux-2.6/drivers/char/pty.c~pty-fixes2 2009-07-26 20:04:17.000000000 +0900
+++ linux-2.6-hirofumi/drivers/char/pty.c 2009-07-26 20:06:17.000000000 +0900
@@ -51,11 +51,19 @@ static void pty_close(struct tty_struct
tty->packet = 0;
if (!tty->link)
return;
- tty->link->packet = 0;
+
+ /*
+ * This try to flush pending tty->buf. And after flushed all
+ * pending tty->buf, TTY_OTHER_CLOSED will be set.
+ */
+ set_bit(TTY_OTHER_CLOSING, &tty->link->flags);
tty_flip_buffer_push(tty->link);
+#if 0
+ tty->link->packet = 0;
set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
wake_up_interruptible(&tty->link->read_wait);
wake_up_interruptible(&tty->link->write_wait);
+#endif
if (tty->driver->subtype == PTY_TYPE_MASTER) {
set_bit(TTY_OTHER_CLOSED, &tty->flags);
#ifdef CONFIG_UNIX98_PTYS
@@ -199,17 +207,22 @@ static int pty_open(struct tty_struct *t
goto out;
retval = -EIO;
- if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
+ if (test_bit(TTY_OTHER_CLOSING, &tty->flags) ||
+ test_bit(TTY_OTHER_CLOSED, &tty->flags))
goto out;
if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
goto out;
if (tty->link->count != 1)
goto out;
+ spin_lock_irq(&tty->link->buf.lock);
+ clear_bit(TTY_OTHER_CLOSING, &tty->link->flags);
clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
+ spin_unlock_irq(&tty->link->buf.lock);
+
set_bit(TTY_THROTTLED, &tty->flags);
retval = 0;
- tty->low_latency = 1;
+// tty->low_latency = 1;
out:
return retval;
}
diff -puN drivers/char/tty_buffer.c~pty-fixes2 drivers/char/tty_buffer.c
--- linux-2.6/drivers/char/tty_buffer.c~pty-fixes2 2009-07-26 20:04:17.000000000 +0900
+++ linux-2.6-hirofumi/drivers/char/tty_buffer.c 2009-07-26 20:04:46.000000000 +0900
@@ -74,6 +74,20 @@ static struct tty_buffer *tty_buffer_all
return p;
}
+/* must hold tty->buf.lock */
+static void tty_check_other_closing(struct tty_struct *tty)
+{
+ if (test_bit(TTY_OTHER_CLOSING, &tty->flags)) {
+ printk("%s: tty %p, closed\n", __func__, tty);
+ tty->link->packet = 0;
+ set_bit(TTY_OTHER_CLOSED, &tty->flags);
+ wake_up_interruptible(&tty->read_wait);
+ wake_up_interruptible(&tty->write_wait);
+ /* Clear TTY_OTHER_CLOSING after set TTY_OTHER_CLOSED */
+ clear_bit(TTY_OTHER_CLOSING, &tty->flags);
+ }
+}
+
/**
* tty_buffer_free - free a tty buffer
* @tty: tty owning the buffer
@@ -119,6 +133,7 @@ static void __tty_buffer_flush(struct tt
tty_buffer_free(tty, thead);
}
tty->buf.tail = NULL;
+ tty_check_other_closing(tty);
}
/**
@@ -407,8 +422,12 @@ static void flush_to_ldisc(struct work_s
unsigned char *flag_buf;
disc = tty_ldisc_ref(tty);
- if (disc == NULL) /* !TTY_LDISC */
+ if (disc == NULL) { /* !TTY_LDISC */
+ spin_lock_irqsave(&tty->buf.lock, flags);
+ tty_check_other_closing(tty);
+ spin_unlock_irqrestore(&tty->buf.lock, flags);
return;
+ }
spin_lock_irqsave(&tty->buf.lock, flags);
/* So we know a flush is running */
@@ -419,8 +438,11 @@ static void flush_to_ldisc(struct work_s
for (;;) {
int count = head->commit - head->read;
if (!count) {
- if (head->next == NULL)
+ if (head->next == NULL) {
+ printk("%s: tty %p, next == NULL\n", __func__, tty);
+ tty_check_other_closing(tty);
break;
+ }
tbuf = head;
head = head->next;
tty_buffer_free(tty, tbuf);
@@ -448,9 +470,11 @@ static void flush_to_ldisc(struct work_s
/* Restore the queue head */
tty->buf.head = head;
}
+
/* We may have a deferred request to flush the input buffer,
if so pull the chain under the lock and empty the queue */
if (test_bit(TTY_FLUSHPENDING, &tty->flags)) {
+ printk("%s: tty %p, flushing\n", __func__, tty);
__tty_buffer_flush(tty);
clear_bit(TTY_FLUSHPENDING, &tty->flags);
wake_up(&tty->read_wait);
diff -puN include/linux/tty.h~pty-fixes2 include/linux/tty.h
--- linux-2.6/include/linux/tty.h~pty-fixes2 2009-07-26 20:04:17.000000000 +0900
+++ linux-2.6-hirofumi/include/linux/tty.h 2009-07-26 20:04:17.000000000 +0900
@@ -309,12 +309,13 @@ struct tty_struct {
*/
#define TTY_THROTTLED 0 /* Call unthrottle() at threshold min */
#define TTY_IO_ERROR 1 /* Cause an I/O error (may be no ldisc too) */
-#define TTY_OTHER_CLOSED 2 /* Other side (if any) has closed */
-#define TTY_EXCLUSIVE 3 /* Exclusive open mode */
-#define TTY_DEBUG 4 /* Debugging */
-#define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */
-#define TTY_PUSH 6 /* n_tty private */
-#define TTY_CLOSING 7 /* ->close() in progress */
+#define TTY_OTHER_CLOSING 2 /* Other side (if any) is closing */
+#define TTY_OTHER_CLOSED 3 /* Other side (if any) has closed */
+#define TTY_EXCLUSIVE 4 /* Exclusive open mode */
+#define TTY_DEBUG 5 /* Debugging */
+#define TTY_DO_WRITE_WAKEUP 6 /* Call write_wakeup after queuing new */
+#define TTY_PUSH 7 /* n_tty private */
+#define TTY_CLOSING 8 /* ->close() in progress */
#define TTY_LDISC 9 /* Line discipline attached */
#define TTY_LDISC_CHANGING 10 /* Line discipline changing */
#define TTY_LDISC_OPEN 11 /* Line discipline is open */
_
--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
next prev parent reply other threads:[~2009-07-26 12:06 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-23 23:45 [Regression] kdesu broken Rafael J. Wysocki
2009-07-24 0:21 ` Ray Lee
2009-07-24 15:21 ` Rafael J. Wysocki
2009-07-24 15:40 ` Alan Cox
2009-07-24 16:34 ` Linus Torvalds
2009-07-25 6:04 ` OGAWA Hirofumi
2009-07-25 13:31 ` Alan Cox
2009-07-25 14:05 ` Alan Cox
2009-07-25 14:55 ` OGAWA Hirofumi
2009-07-25 15:32 ` Alan Cox
2009-07-26 11:51 ` OGAWA Hirofumi [this message]
2009-07-27 10:57 ` Alan Cox
2009-07-27 12:07 ` OGAWA Hirofumi
2009-07-27 12:46 ` OGAWA Hirofumi
2009-07-27 13:23 ` [PATCH] " Alan Cox
2009-07-27 13:50 ` OGAWA Hirofumi
2009-07-27 13:58 ` Alan Cox
2009-07-27 15:04 ` OGAWA Hirofumi
2009-07-27 16:14 ` Aneesh Kumar K.V
2009-07-27 16:42 ` Alan Cox
2009-07-27 17:12 ` Aneesh Kumar K.V
2009-07-27 19:28 ` OGAWA Hirofumi
2009-07-27 19:40 ` Linus Torvalds
2009-07-27 20:38 ` OGAWA Hirofumi
2009-07-27 20:45 ` Linus Torvalds
2009-07-27 21:42 ` Alan Cox
2009-07-27 22:04 ` Linus Torvalds
2009-07-27 22:41 ` Alan Cox
2009-07-27 20:52 ` Alan Cox
2009-07-27 21:22 ` Linus Torvalds
2009-07-27 21:54 ` Alan Cox
2009-07-27 21:20 ` Alan Cox
2009-07-28 5:33 ` OGAWA Hirofumi
2009-07-28 10:22 ` Alan Cox
2009-07-28 10:42 ` OGAWA Hirofumi
2009-07-28 15:49 ` Linus Torvalds
2009-07-28 16:42 ` Alan Cox
2009-07-28 16:49 ` Linus Torvalds
2009-07-28 16:52 ` Linus Torvalds
2009-07-28 17:09 ` Alan Cox
2009-07-28 18:45 ` Linus Torvalds
2009-07-28 17:06 ` Alan Cox
2009-07-28 18:44 ` Linus Torvalds
2009-07-28 18:56 ` Alan Cox
2009-07-28 19:08 ` Linus Torvalds
2009-07-28 19:15 ` Alan Cox
2009-07-28 19:56 ` Greg KH
2009-07-28 20:47 ` Theodore Tso
2009-07-28 21:01 ` Greg KH
2009-07-28 22:02 ` Theodore Tso
2009-07-28 23:49 ` Alan Cox
2009-07-29 0:12 ` Greg KH
2009-07-30 23:16 ` Alan Cox
2009-07-30 23:24 ` Greg KH
2009-07-31 13:49 ` Alan Cox
2009-07-31 14:17 ` Greg KH
2009-07-28 23:46 ` Alan Cox
2009-07-29 0:10 ` Linus Torvalds
2009-07-29 0:26 ` Linus Torvalds
2009-07-29 7:01 ` Aneesh Kumar K.V
2009-07-29 0:34 ` Alan Cox
2009-07-29 1:04 ` Linus Torvalds
2009-07-29 1:23 ` Linus Torvalds
2009-07-29 11:17 ` Alan Cox
2009-07-29 8:59 ` Alan Cox
2009-07-29 15:48 ` Linus Torvalds
2009-07-29 15:55 ` Alan Cox
2009-07-29 16:05 ` Linus Torvalds
2009-07-29 16:39 ` Alan Cox
2009-07-29 19:07 ` Linus Torvalds
2009-07-29 2:50 ` Gene Heskett
2009-07-29 4:49 ` Linus Torvalds
2009-07-29 4:54 ` Linus Torvalds
2009-07-29 5:04 ` Gene Heskett
2009-07-29 5:00 ` Gene Heskett
2009-07-29 5:08 ` Andrew Morton
2009-07-29 7:46 ` Gene Heskett
2009-07-29 11:07 ` Alan Cox
2009-07-29 17:40 ` Gene Heskett
2009-07-29 18:28 ` Frans Pop
2009-07-29 18:43 ` Gene Heskett
2009-07-29 19:08 ` Frans Pop
2009-07-29 19:19 ` Gene Heskett
2009-07-30 12:43 ` Valdis.Kletnieks
2009-07-30 15:35 ` Gene Heskett
2009-07-30 18:39 ` Valdis.Kletnieks
2009-07-31 2:01 ` H. Peter Anvin
2009-07-28 15:48 ` Linus Torvalds
2009-07-28 16:16 ` OGAWA Hirofumi
2009-07-27 18:28 ` Andreas Schwab
2009-07-27 13:58 ` Aneesh Kumar K.V
2009-07-25 20:12 ` [Regression] " Rafael J. Wysocki
2009-07-26 17:41 ` Aneesh Kumar K.V
2009-07-29 2:20 ` Gene Heskett
2009-07-25 11:48 ` Alan Cox
2009-07-25 14:02 ` Frans Pop
2009-07-25 20:16 ` Rafael J. Wysocki
2009-07-25 21:03 ` Alan Cox
2009-07-26 15:51 ` Sergey Senozhatsky
2009-07-24 18:25 ` Aneesh Kumar K.V
2009-07-25 12:07 ` Alan Cox
2009-07-25 16:18 ` Aneesh Kumar K.V
2009-07-25 17:06 ` Aneesh Kumar K.V
2009-07-29 19:09 ` [Regression] kdesu broken, now usb fixed in current git pull Gene Heskett
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=87bpn7mzli.fsf@devron.myhome.or.jp \
--to=hirofumi@mail.parknet.co.jp \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=ray-lk@madrabbit.org \
--cc=rjw@sisk.pl \
--cc=torvalds@linux-foundation.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