From: Ilya Zykov <ilya@ilyx.ru>
To: Xiaobing Tu <xiaobing.tu@intel.com>
Cc: Alan Cox <alan@linux.intel.com>, Jiri Slaby <jslaby@suse.cz>,
Alek Du <alek.du@intel.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
ilya@ilyx.ru, linux-kernel@vger.kernel.org,
linux-serial@vger.kernel.org
Subject: Fwd: [PATCH] tty: Correct tty buffer flushing.
Date: Thu, 29 Nov 2012 04:03:30 +0400 [thread overview]
Message-ID: <50B6A652.9000107@ilyx.ru> (raw)
In-Reply-To: <50B55A93.4090900@ilyx.ru>
This patch abolish:
[PATCH] tty: hold lock across tty buffer finding and buffer filling.
commit f8f72f047b96c6c8b13f6e3ba53fa6feb4266813
The commit f8f72f047 very dirty, has many degradation on SMP systems, because take
spinlock at long time, and it doesn't resolve problem with tty_prepare_string*().
We lose all advantage from the use of flip buffer. Can't write/read to/from buffer
without lock.
The root of problem it use carelessly buffer flushing, then another thread can write to it.
This patch resolves this problem and doesn't let lose advantage from flip buffer use.
Signed-off-by: Ilya Zykov <ilya@ilyx.ru>
---
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index 6c9b7cd..4f02f9c 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -114,11 +114,14 @@ static void __tty_buffer_flush(struct tty_struct *tty)
{
struct tty_buffer *thead;
- while ((thead = tty->buf.head) != NULL) {
- tty->buf.head = thead->next;
- tty_buffer_free(tty, thead);
+ if (tty->buf.head == NULL)
+ return;
+ while ((thead = tty->buf.head->next) != NULL) {
+ tty_buffer_free(tty, tty->buf.head);
+ tty->buf.head = thead;
}
- tty->buf.tail = NULL;
+ WARN_ON(tty->buf.head != tty->buf.tail);
+ tty->buf.head->read = tty->buf.head->commit;
}
/**
next prev parent reply other threads:[~2012-11-29 0:03 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-28 0:28 [PATCH] tty: Correct tty buffer flushing Ilya Zykov
2012-11-29 0:03 ` Ilya Zykov [this message]
2012-11-29 13:54 ` Alan Cox
2012-11-29 14:03 ` Ilya Zykov
2012-11-29 14:13 ` Ilya Zykov
2012-11-29 21:28 ` Alan Cox
2012-11-30 1:14 ` Peter Hurley
2012-12-04 8:53 ` Alan Cox
2012-12-04 10:11 ` Ilya Zykov
2012-11-29 17:48 ` Ilya Zykov
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=50B6A652.9000107@ilyx.ru \
--to=ilya@ilyx.ru \
--cc=alan@linux.intel.com \
--cc=alek.du@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=xiaobing.tu@intel.com \
/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