From: Richard Weinberger <richard@nod.at>
To: jslaby@suse.cz
Cc: user-mode-linux-devel@lists.sourceforge.net,
gregkh@linuxfoundation.org, Jeff Dike <jdike@addtoit.com>,
linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk,
Richard Weinberger <richard@nod.at>,
alan@linux.intel.com
Subject: [uml-devel] [PATCH 2/6] TTY: um/line, use tty from tty_port
Date: Mon, 4 Jun 2012 22:27:33 +0200 [thread overview]
Message-ID: <1338841657-30358-3-git-send-email-richard@nod.at> (raw)
In-Reply-To: <1338841657-30358-1-git-send-email-richard@nod.at>
From: Jiri Slaby <jslaby@suse.cz>
This means switching to the tty refcounted model so that we will not
race with interrupts.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: user-mode-linux-devel@lists.sourceforge.net
Signed-off-by: Richard Weinberger <richard@nod.at>
---
arch/um/drivers/chan_kern.c | 4 +++-
arch/um/drivers/line.c | 25 ++++++++++++++++++-------
arch/um/drivers/line.h | 1 -
3 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/arch/um/drivers/chan_kern.c b/arch/um/drivers/chan_kern.c
index 45e248c..87eebfe 100644
--- a/arch/um/drivers/chan_kern.c
+++ b/arch/um/drivers/chan_kern.c
@@ -150,9 +150,11 @@ void chan_enable_winch(struct chan *chan, struct tty_struct *tty)
static void line_timer_cb(struct work_struct *work)
{
struct line *line = container_of(work, struct line, task.work);
+ struct tty_struct *tty = tty_port_tty_get(&line->port);
if (!line->throttled)
- chan_interrupt(line, line->tty, line->driver->read_irq);
+ chan_interrupt(line, tty, line->driver->read_irq);
+ tty_kref_put(tty);
}
int enable_chan(struct line *line)
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index 482a7bd..fb6e4ea 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -19,9 +19,11 @@ static irqreturn_t line_interrupt(int irq, void *data)
{
struct chan *chan = data;
struct line *line = chan->line;
+ struct tty_struct *tty = tty_port_tty_get(&line->port);
if (line)
- chan_interrupt(line, line->tty, irq);
+ chan_interrupt(line, tty, irq);
+ tty_kref_put(tty);
return IRQ_HANDLED;
}
@@ -333,7 +335,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
{
struct chan *chan = data;
struct line *line = chan->line;
- struct tty_struct *tty = line->tty;
+ struct tty_struct *tty;
int err;
/*
@@ -352,10 +354,13 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
}
spin_unlock(&line->lock);
+ tty = tty_port_tty_get(&line->port);
if (tty == NULL)
return IRQ_NONE;
tty_wakeup(tty);
+ tty_kref_put(tty);
+
return IRQ_HANDLED;
}
@@ -409,7 +414,7 @@ int line_open(struct line *lines, struct tty_struct *tty)
BUG_ON(tty->driver_data);
tty->driver_data = line;
- line->tty = tty;
+ tty_port_tty_set(&line->port, tty);
err = enable_chan(line);
if (err) /* line_close() will be called by our caller */
@@ -449,7 +454,7 @@ void line_close(struct tty_struct *tty, struct file * filp)
if (--line->port.count)
goto out_unlock;
- line->tty = NULL;
+ tty_port_tty_set(&line->port, NULL);
tty->driver_data = NULL;
if (line->sigio) {
@@ -610,9 +615,15 @@ int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
mutex_lock(&line->count_lock);
if (!line->valid)
CONFIG_CHUNK(str, size, n, "none", 1);
- else if (line->tty == NULL)
- CONFIG_CHUNK(str, size, n, line->init_str, 1);
- else n = chan_config_string(line, str, size, error_out);
+ else {
+ struct tty_struct *tty = tty_port_tty_get(&line->port);
+ if (tty == NULL) {
+ CONFIG_CHUNK(str, size, n, line->init_str, 1);
+ } else {
+ n = chan_config_string(line, str, size, error_out);
+ tty_kref_put(tty);
+ }
+ }
mutex_unlock(&line->count_lock);
return n;
diff --git a/arch/um/drivers/line.h b/arch/um/drivers/line.h
index 0e06a1f..5b3d4fb 100644
--- a/arch/um/drivers/line.h
+++ b/arch/um/drivers/line.h
@@ -33,7 +33,6 @@ struct line_driver {
struct line {
struct tty_port port;
- struct tty_struct *tty;
struct mutex count_lock;
int valid;
--
1.7.7.3
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
next prev parent reply other threads:[~2012-06-04 20:27 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-04 20:27 um: TTY fixes (?) Richard Weinberger
2012-06-04 20:27 ` [uml-devel] [PATCH 1/6] TTY: um/line, add tty_port Richard Weinberger
2012-06-04 20:27 ` Richard Weinberger [this message]
2012-06-04 20:27 ` [uml-devel] [PATCH 3/6] um: remove line_ioctl() Richard Weinberger
2012-06-04 20:27 ` [uml-devel] [PATCH 4/6] um: Remove dead code Richard Weinberger
2012-06-04 20:27 ` [uml-devel] [PATCH 5/6] um: fully use tty_port Richard Weinberger
2012-06-04 20:47 ` Jiri Slaby
2012-06-04 20:27 ` [uml-devel] [PATCH 6/6] um: remove count_lock Richard Weinberger
2012-06-04 21:17 ` [uml-devel] um: TTY fixes (?) Alan Cox
2012-06-04 23:14 ` Richard Weinberger
2012-06-05 10:41 ` Karel Zak
2012-06-05 11:15 ` [uml-devel] " Alan Cox
2012-06-05 12:20 ` Richard Weinberger
2012-06-05 15:17 ` [uml-devel] " Karel Zak
2012-07-12 14:49 ` Karel Zak
2012-07-12 15:01 ` Richard Weinberger
2012-06-06 23:17 ` Richard Weinberger
2012-06-07 9:19 ` Alan Cox
2012-06-07 9:06 ` Richard Weinberger
2012-06-06 14:20 ` [uml-devel] " Boaz Harrosh
2012-06-07 7:35 ` Boaz Harrosh
2012-06-07 7:43 ` Boaz Harrosh
2012-06-07 8:45 ` Richard Weinberger
2012-06-07 9:22 ` Alan Cox
2012-06-07 10:14 ` Boaz Harrosh
2012-06-07 10:19 ` Richard Weinberger
2012-06-07 10:35 ` Boaz Harrosh
2012-06-07 10:52 ` Alan Cox
2012-06-07 13:41 ` Boaz Harrosh
2012-06-07 15:18 ` Richard Weinberger
2012-06-07 16:37 ` Alan Cox
2012-06-07 16:32 ` Richard Weinberger
2012-06-07 16:50 ` Alan Cox
2012-06-07 16:41 ` Richard Weinberger
2012-06-07 17:26 ` Alan Cox
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=1338841657-30358-3-git-send-email-richard@nod.at \
--to=richard@nod.at \
--cc=alan@linux.intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=jdike@addtoit.com \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=user-mode-linux-devel@lists.sourceforge.net \
--cc=viro@zeniv.linux.org.uk \
/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).