Takashi Iwai 561ec6
From aabdbb1b7a5819e18c403334a31fb0cc2c06ad41 Mon Sep 17 00:00:00 2001
Takashi Iwai 561ec6
From: John Ogness <john.ogness@linutronix.de>
Takashi Iwai 561ec6
Date: Fri, 6 May 2022 23:39:24 +0206
Takashi Iwai 561ec6
Subject: [PATCH] serial: msm_serial: disable interrupts in __msm_console_write()
Takashi Iwai 561ec6
Git-commit: aabdbb1b7a5819e18c403334a31fb0cc2c06ad41
Takashi Iwai 561ec6
Patch-mainline: v5.19-rc1
Takashi Iwai 561ec6
References: git-fixes
Takashi Iwai 561ec6
Takashi Iwai 561ec6
__msm_console_write() assumes that interrupts are disabled, but
Takashi Iwai 561ec6
with threaded console printers it is possible that the write()
Takashi Iwai 561ec6
callback of the console is called with interrupts enabled.
Takashi Iwai 561ec6
Takashi Iwai 561ec6
Explicitly disable interrupts using local_irq_save() to preserve
Takashi Iwai 561ec6
the assumed context.
Takashi Iwai 561ec6
Takashi Iwai 561ec6
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Takashi Iwai 561ec6
Reviewed-by: Petr Mladek <pmladek@suse.com>
Takashi Iwai 561ec6
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Takashi Iwai 561ec6
Link: https://lore.kernel.org/r/20220506213324.470461-1-john.ogness@linutronix.de
Takashi Iwai 561ec6
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Takashi Iwai 561ec6
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 561ec6
Takashi Iwai 561ec6
---
Takashi Iwai 561ec6
 drivers/tty/serial/msm_serial.c | 5 +++++
Takashi Iwai 561ec6
 1 file changed, 5 insertions(+)
Takashi Iwai 561ec6
Takashi Iwai 561ec6
diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
Takashi Iwai 561ec6
index 23c94b927776..e676ec761f18 100644
Takashi Iwai 561ec6
--- a/drivers/tty/serial/msm_serial.c
Takashi Iwai 561ec6
+++ b/drivers/tty/serial/msm_serial.c
Takashi Iwai 561ec6
@@ -1599,6 +1599,7 @@ static inline struct uart_port *msm_get_port_from_line(unsigned int line)
Takashi Iwai 561ec6
 static void __msm_console_write(struct uart_port *port, const char *s,
Takashi Iwai 561ec6
 				unsigned int count, bool is_uartdm)
Takashi Iwai 561ec6
 {
Takashi Iwai 561ec6
+	unsigned long flags;
Takashi Iwai 561ec6
 	int i;
Takashi Iwai 561ec6
 	int num_newlines = 0;
Takashi Iwai 561ec6
 	bool replaced = false;
Takashi Iwai 561ec6
@@ -1616,6 +1617,8 @@ static void __msm_console_write(struct uart_port *port, const char *s,
Takashi Iwai 561ec6
 			num_newlines++;
Takashi Iwai 561ec6
 	count += num_newlines;
Takashi Iwai 561ec6
 
Takashi Iwai 561ec6
+	local_irq_save(flags);
Takashi Iwai 561ec6
+
Takashi Iwai 561ec6
 	if (port->sysrq)
Takashi Iwai 561ec6
 		locked = 0;
Takashi Iwai 561ec6
 	else if (oops_in_progress)
Takashi Iwai 561ec6
@@ -1661,6 +1664,8 @@ static void __msm_console_write(struct uart_port *port, const char *s,
Takashi Iwai 561ec6
 
Takashi Iwai 561ec6
 	if (locked)
Takashi Iwai 561ec6
 		spin_unlock(&port->lock);
Takashi Iwai 561ec6
+
Takashi Iwai 561ec6
+	local_irq_restore(flags);
Takashi Iwai 561ec6
 }
Takashi Iwai 561ec6
 
Takashi Iwai 561ec6
 static void msm_console_write(struct console *co, const char *s,
Takashi Iwai 561ec6
-- 
Takashi Iwai 561ec6
2.35.3
Takashi Iwai 561ec6