On Wednesday 05 March 2014 01:58 AM, David Miller wrote: > From: David Miller <davem@xxxxxxxxxxxxx> > Date: Tue, 04 Mar 2014 14:10:03 -0500 (EST) > >> From: Kirill Tkhai <tkhai@xxxxxxxxx> >> Date: Fri, 28 Feb 2014 18:51:23 +0400 >> >>> This should be fixed like that's done for 8250 >>> [patch drivers-serial-cleanup-locking-for-rt.patch] >> >> Like the patch below? tested. Sounds good to me. Tested-by: Allen Pais <allen.pais@xxxxxxxxxx> > > Here's an updated patch that takes care of all of the Sun serial > drivers, and is compile tested: > > -------------------- > sparc: serial: Clean up the locking for -rt > > Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> > > diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c > index cf86e72..dc697ce 100644 > --- a/drivers/tty/serial/sunhv.c > +++ b/drivers/tty/serial/sunhv.c > @@ -433,13 +433,10 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign > unsigned long flags; > int locked = 1; > > - local_irq_save(flags); > - if (port->sysrq) { > - locked = 0; > - } else if (oops_in_progress) { > - locked = spin_trylock(&port->lock); > - } else > - spin_lock(&port->lock); > + if (port->sysrq || oops_in_progress) > + locked = spin_trylock_irqsave(&port->lock, flags); > + else > + spin_lock_irqsave(&port->lock, flags); > > while (n > 0) { > unsigned long ra = __pa(con_write_page); > @@ -470,8 +467,7 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign > } > > if (locked) > - spin_unlock(&port->lock); > - local_irq_restore(flags); > + spin_unlock_irqrestore(&port->lock, flags); > } > > static inline void sunhv_console_putchar(struct uart_port *port, char c) > @@ -492,7 +488,10 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig > unsigned long flags; > int i, locked = 1; > > - local_irq_save(flags); > + if (port->sysrq || oops_in_progress) > + locked = spin_trylock_irqsave(&port->lock, flags); > + else > + spin_lock_irqsave(&port->lock, flags); > if (port->sysrq) { > locked = 0; > } else if (oops_in_progress) { > @@ -507,8 +506,7 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig > } > > if (locked) > - spin_unlock(&port->lock); > - local_irq_restore(flags); > + spin_unlock_irqrestore(&port->lock, flags); > } > > static struct console sunhv_console = { > diff --git a/drivers/tty/serial/sunsab.c b/drivers/tty/serial/sunsab.c > index 380fb53..5faa8e9 100644 > --- a/drivers/tty/serial/sunsab.c > +++ b/drivers/tty/serial/sunsab.c > @@ -844,20 +844,16 @@ static void sunsab_console_write(struct console *con, const char *s, unsigned n) > unsigned long flags; > int locked = 1; > > - local_irq_save(flags); > - if (up->port.sysrq) { > - locked = 0; > - } else if (oops_in_progress) { > - locked = spin_trylock(&up->port.lock); > - } else > - spin_lock(&up->port.lock); > + if (up->port.sysrq || oops_in_progress) > + locked = spin_trylock_irqsave(&up->port.lock, flags); > + else > + spin_lock_irqsave(&up->port.lock, flags); > > uart_console_write(&up->port, s, n, sunsab_console_putchar); > sunsab_tec_wait(up); > > if (locked) > - spin_unlock(&up->port.lock); > - local_irq_restore(flags); > + spin_unlock_irqrestore(&up->port.lock, flags); > } > > static int sunsab_console_setup(struct console *con, char *options) > diff --git a/drivers/tty/serial/sunsu.c b/drivers/tty/serial/sunsu.c > index db79b76..9a0f24f 100644 > --- a/drivers/tty/serial/sunsu.c > +++ b/drivers/tty/serial/sunsu.c > @@ -1295,13 +1295,10 @@ static void sunsu_console_write(struct console *co, const char *s, > unsigned int ier; > int locked = 1; > > - local_irq_save(flags); > - if (up->port.sysrq) { > - locked = 0; > - } else if (oops_in_progress) { > - locked = spin_trylock(&up->port.lock); > - } else > - spin_lock(&up->port.lock); > + if (up->port.sysrq || oops_in_progress) > + locked = spin_trylock_irqsave(&up->port.lock, flags); > + else > + spin_lock_irqsave(&up->port.lock, flags); > > /* > * First save the UER then disable the interrupts > @@ -1319,8 +1316,7 @@ static void sunsu_console_write(struct console *co, const char *s, > serial_out(up, UART_IER, ier); > > if (locked) > - spin_unlock(&up->port.lock); > - local_irq_restore(flags); > + spin_unlock_irqrestore(&up->port.lock, flags); > } > > /* > diff --git a/drivers/tty/serial/sunzilog.c b/drivers/tty/serial/sunzilog.c > index 45a8c6a..a2c40ed 100644 > --- a/drivers/tty/serial/sunzilog.c > +++ b/drivers/tty/serial/sunzilog.c > @@ -1195,20 +1195,16 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count) > unsigned long flags; > int locked = 1; > > - local_irq_save(flags); > - if (up->port.sysrq) { > - locked = 0; > - } else if (oops_in_progress) { > - locked = spin_trylock(&up->port.lock); > - } else > - spin_lock(&up->port.lock); > + if (up->port.sysrq || oops_in_progress) > + locked = spin_trylock_irqsave(&up->port.lock, flags); > + else > + spin_lock_irqsave(&up->port.lock, flags); > > uart_console_write(&up->port, s, count, sunzilog_putchar); > udelay(2); > > if (locked) > - spin_unlock(&up->port.lock); > - local_irq_restore(flags); > + spin_unlock_irqrestore(&up->port.lock, flags); > } > > static int __init sunzilog_console_setup(struct console *con, char *options) > -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html