summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-10-14 09:20:41 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-10-14 15:14:31 -0700
commit97ad5a034dcc164269d0b8a5cb3e827b33455c11 (patch)
treea6bb960fbfeb3579212cd066138f7d159cf66760
parent8c53e46314562fe814b0afef6cfcbd2f562b017c (diff)
downloadlinux-97ad5a034dcc164269d0b8a5cb3e827b33455c11.tar.gz
linux-97ad5a034dcc164269d0b8a5cb3e827b33455c11.tar.bz2
linux-97ad5a034dcc164269d0b8a5cb3e827b33455c11.zip
tty: use the new 'flush_delayed_work()' helper to do ldisc flush
This way all flush_to_ldisc work is always done through the workqueues, and we thus have a single point of serialization. It also means that we can avoid calling flush_to_ldisc() entirely if there was no delayed work pending. [ Side note: using workqueues and keventd as the single way to enter flush_to_ldisc() still doesn't absolutely guarantee that we can't have concurrency: keventd is multithreaded and has a thread per CPU, and while the WORK_STRUCT_PENDING bit guarantees a single work only being on the pending list once, the work might be both pending and _running_ at the same time. Workqueues are not simple. ] This was also confirmed to fix bugzilla #14388, even without the earlier locking fix and cleanup (commit c8e331419: "tty: Make flush_to_ldisc() locking more robust"). So both commits fix the same bug differently, and either would have worked on its own. But I'm committing them both since they are cleanups independent of each other. Reported-and-tested-by: Boyan <btanastasov@yahoo.co.uk> Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/char/tty_buffer.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
index 0296612cc7df..66fa4e10d76b 100644
--- a/drivers/char/tty_buffer.c
+++ b/drivers/char/tty_buffer.c
@@ -468,7 +468,7 @@ static void flush_to_ldisc(struct work_struct *work)
*/
void tty_flush_to_ldisc(struct tty_struct *tty)
{
- flush_to_ldisc(&tty->buf.work.work);
+ flush_delayed_work(&tty->buf.work);
}
/**