Commit 54089d4c authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

TTY: srmcons, convert to use tty_port



This is needed because the tty buffer will become a tty_port member
later. That will help us to wipe out most of the races and checks for
the tty pointer in hot paths.

Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ee024d49
Loading
Loading
Loading
Loading
+17 −15
Original line number Diff line number Diff line
@@ -30,9 +30,8 @@ static int srm_is_registered_console = 0;
#define MAX_SRM_CONSOLE_DEVICES 1	/* only support 1 console device */

struct srmcons_private {
	struct tty_struct *tty;
	struct tty_port port;
	struct timer_list timer;
	spinlock_t lock;
} srmcons_singleton;

typedef union _srmcons_result {
@@ -68,20 +67,21 @@ static void
srmcons_receive_chars(unsigned long data)
{
	struct srmcons_private *srmconsp = (struct srmcons_private *)data;
	struct tty_port *port = &srmconsp->port;
	unsigned long flags;
	int incr = 10;

	local_irq_save(flags);
	if (spin_trylock(&srmcons_callback_lock)) {
		if (!srmcons_do_receive_chars(srmconsp->tty))
		if (!srmcons_do_receive_chars(port->tty))
			incr = 100;
		spin_unlock(&srmcons_callback_lock);
	} 

	spin_lock(&srmconsp->lock);
	if (srmconsp->tty)
	spin_lock(&port->lock);
	if (port->tty)
		mod_timer(&srmconsp->timer, jiffies + incr);
	spin_unlock(&srmconsp->lock);
	spin_unlock(&port->lock);

	local_irq_restore(flags);
}
@@ -157,18 +157,19 @@ static int
srmcons_open(struct tty_struct *tty, struct file *filp)
{
	struct srmcons_private *srmconsp = &srmcons_singleton;
	struct tty_port *port = &srmconsp->port;
	unsigned long flags;

	spin_lock_irqsave(&srmconsp->lock, flags);
	spin_lock_irqsave(&port->lock, flags);

	if (!srmconsp->tty) {
	if (!port->tty) {
		tty->driver_data = srmconsp;

		srmconsp->tty = tty;
		tty->port = port;
		port->tty = tty; /* XXX proper refcounting */
		mod_timer(&srmconsp->timer, jiffies + 10);
	}

	spin_unlock_irqrestore(&srmconsp->lock, flags);
	spin_unlock_irqrestore(&port->lock, flags);

	return 0;
}
@@ -177,16 +178,17 @@ static void
srmcons_close(struct tty_struct *tty, struct file *filp)
{
	struct srmcons_private *srmconsp = tty->driver_data;
	struct tty_port *port = &srmconsp->port;
	unsigned long flags;

	spin_lock_irqsave(&srmconsp->lock, flags);
	spin_lock_irqsave(&port->lock, flags);

	if (tty->count == 1) {
		srmconsp->tty = NULL;
		port->tty = NULL;
		del_timer(&srmconsp->timer);
	}

	spin_unlock_irqrestore(&srmconsp->lock, flags);
	spin_unlock_irqrestore(&port->lock, flags);
}


@@ -203,7 +205,7 @@ static const struct tty_operations srmcons_ops = {
static int __init
srmcons_init(void)
{
	spin_lock_init(&srmcons_singleton.lock);
	tty_port_init(&srmcons_singleton.port);
	setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
			(unsigned long)&srmcons_singleton);
	if (srm_is_registered_console) {