Hi, David! On 04.03.2014 23:10, David Miller wrote: > 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? Exactly this. > Is this transformation legitimate outside of the -rt tree? I wish the commit > messages for the 8250 change was more verbose, explaining exactly why this > is needed. > > And if it's needed, all the sparc serial/console drivers need this too. port->lock is mutex, so we should not disable interrupts before we are doing spin_lock(). In RT spin_trylock_irqsave() does not disable irqs. The patch is made to be good for both RT and !RT cases, so everything is ok! Really I don't know, why the original patch is not in upstream ***shrugging***. It's from 2009, everything is possible. > 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 = { > -- 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