tty: serial: samsung: add spin_lock for interrupt and console_write
authorJaewon Kim <jaewon02.kim@samsung.com>
Thu, 7 Apr 2022 07:16:19 +0000 (16:16 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Apr 2022 06:42:46 +0000 (08:42 +0200)
The console_write and IRQ handler can run concurrently.
Problems may occurs console_write is continuously executed while
the IRQ handler is running.

Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
Signed-off-by: Jaewon Kim <jaewon02.kim@samsung.com>
Link: https://lore.kernel.org/r/20220407071619.102249-2-jaewon02.kim@samsung.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/samsung_tty.c

index e1585fbae909d5d0be630ed135f5dec030481ce2..8af5aceb9f4ed6190864a74fdbacc99b561fa80c 100644 (file)
@@ -2480,12 +2480,24 @@ s3c24xx_serial_console_write(struct console *co, const char *s,
                             unsigned int count)
 {
        unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON);
+       unsigned long flags;
+       bool locked = true;
 
        /* not possible to xmit on unconfigured port */
        if (!s3c24xx_port_configured(ucon))
                return;
 
+       if (cons_uart->sysrq)
+               locked = false;
+       else if (oops_in_progress)
+               locked = spin_trylock_irqsave(&cons_uart->lock, flags);
+       else
+               spin_lock_irqsave(&cons_uart->lock, flags);
+
        uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar);
+
+       if (locked)
+               spin_unlock_irqrestore(&cons_uart->lock, flags);
 }
 
 /* Shouldn't be __init, as it can be instantiated from other module */