summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0057-serial-core-Use-port-lock-wrappers.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches-rt/0057-serial-core-Use-port-lock-wrappers.patch365
1 files changed, 365 insertions, 0 deletions
diff --git a/debian/patches-rt/0057-serial-core-Use-port-lock-wrappers.patch b/debian/patches-rt/0057-serial-core-Use-port-lock-wrappers.patch
new file mode 100644
index 000000000..33c270382
--- /dev/null
+++ b/debian/patches-rt/0057-serial-core-Use-port-lock-wrappers.patch
@@ -0,0 +1,365 @@
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Thu, 14 Sep 2023 20:44:14 +0206
+Subject: [PATCH 057/134] serial: core: Use port lock wrappers
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6.7-rt18.tar.xz
+
+When a serial port is used for kernel console output, then all
+modifications to the UART registers which are done from other contexts,
+e.g. getty, termios, are interference points for the kernel console.
+
+So far this has been ignored and the printk output is based on the
+principle of hope. The rework of the console infrastructure which aims to
+support threaded and atomic consoles, requires to mark sections which
+modify the UART registers as unsafe. This allows the atomic write function
+to make informed decisions and eventually to restore operational state. It
+also allows to prevent the regular UART code from modifying UART registers
+while printk output is in progress.
+
+All modifications of UART registers are guarded by the UART port lock,
+which provides an obvious synchronization point with the console
+infrastructure.
+
+To avoid adding this functionality to all UART drivers, wrap the
+spin_[un]lock*() invocations for uart_port::lock into helper functions
+which just contain the spin_[un]lock*() invocations for now. In a
+subsequent step these helpers will gain the console synchronization
+mechanisms.
+
+Converted with coccinelle. No functional change.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Link: https://lore.kernel.org/r/20230914183831.587273-58-john.ogness@linutronix.de
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/tty/serial/serial_core.c | 92 +++++++++++++++++++--------------------
+ drivers/tty/serial/serial_port.c | 4 -
+ 2 files changed, 48 insertions(+), 48 deletions(-)
+
+--- a/drivers/tty/serial/serial_core.c
++++ b/drivers/tty/serial/serial_core.c
+@@ -79,7 +79,7 @@
+ ({ \
+ struct uart_port *__uport = uart_port_ref(state); \
+ if (__uport) \
+- spin_lock_irqsave(&__uport->lock, flags); \
++ uart_port_lock_irqsave(__uport, &flags); \
+ __uport; \
+ })
+
+@@ -87,7 +87,7 @@
+ ({ \
+ struct uart_port *__uport = uport; \
+ if (__uport) { \
+- spin_unlock_irqrestore(&__uport->lock, flags); \
++ uart_port_unlock_irqrestore(__uport, flags); \
+ uart_port_deref(__uport); \
+ } \
+ })
+@@ -179,12 +179,12 @@
+ unsigned long flags;
+ unsigned int old;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ old = port->mctrl;
+ port->mctrl = (old & ~clear) | set;
+ if (old != port->mctrl && !(port->rs485.flags & SER_RS485_ENABLED))
+ port->ops->set_mctrl(port, port->mctrl);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+
+ #define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0)
+@@ -219,7 +219,7 @@
+ /*
+ * Set modem status enables based on termios cflag
+ */
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ if (termios->c_cflag & CRTSCTS)
+ uport->status |= UPSTAT_CTS_ENABLE;
+ else
+@@ -240,7 +240,7 @@
+ else
+ __uart_start(state);
+ }
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ }
+
+ /*
+@@ -702,11 +702,11 @@
+ if (port->ops->send_xchar)
+ port->ops->send_xchar(port, ch);
+ else {
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ port->x_char = ch;
+ if (ch)
+ port->ops->start_tx(port);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ }
+ uart_port_deref(port);
+ }
+@@ -1085,9 +1085,9 @@
+
+ if (!tty_io_error(tty)) {
+ result = uport->mctrl;
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ result |= uport->ops->get_mctrl(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ }
+ out:
+ mutex_unlock(&port->mutex);
+@@ -1223,16 +1223,16 @@
+ uport = uart_port_ref(state);
+ if (!uport)
+ return -EIO;
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ memcpy(&cprev, &uport->icount, sizeof(struct uart_icount));
+ uart_enable_ms(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+
+ add_wait_queue(&port->delta_msr_wait, &wait);
+ for (;;) {
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+
+ set_current_state(TASK_INTERRUPTIBLE);
+
+@@ -1277,9 +1277,9 @@
+ uport = uart_port_ref(state);
+ if (!uport)
+ return -EIO;
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ uart_port_deref(uport);
+
+ icount->cts = cnow.cts;
+@@ -1432,9 +1432,9 @@
+ uart_set_rs485_termination(port, rs485);
+ uart_set_rs485_rx_during_tx(port, rs485);
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ ret = port->rs485_config(port, NULL, rs485);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ if (ret) {
+ memset(rs485, 0, sizeof(*rs485));
+ /* unset GPIOs */
+@@ -1451,9 +1451,9 @@
+ unsigned long flags;
+ struct serial_rs485 aux;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ aux = port->rs485;
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ if (copy_to_user(rs485, &aux, sizeof(aux)))
+ return -EFAULT;
+@@ -1481,7 +1481,7 @@
+ uart_set_rs485_termination(port, &rs485);
+ uart_set_rs485_rx_during_tx(port, &rs485);
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ ret = port->rs485_config(port, &tty->termios, &rs485);
+ if (!ret) {
+ port->rs485 = rs485;
+@@ -1490,7 +1490,7 @@
+ if (!(rs485.flags & SER_RS485_ENABLED))
+ port->ops->set_mctrl(port, port->mctrl);
+ }
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ if (ret) {
+ /* restore old GPIO settings */
+ gpiod_set_value_cansleep(port->rs485_term_gpio,
+@@ -1515,9 +1515,9 @@
+ if (!port->iso7816_config)
+ return -ENOTTY;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ aux = port->iso7816;
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ if (copy_to_user(iso7816, &aux, sizeof(aux)))
+ return -EFAULT;
+@@ -1546,9 +1546,9 @@
+ if (iso7816.reserved[i])
+ return -EINVAL;
+
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ ret = port->iso7816_config(port, &iso7816);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+ if (ret)
+ return ret;
+
+@@ -1765,9 +1765,9 @@
+ if (WARN(!uport, "detached port still initialized!\n"))
+ return;
+
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ uport->ops->stop_rx(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+
+ uart_port_shutdown(port);
+
+@@ -1781,10 +1781,10 @@
+ /*
+ * Free the transmit buffer.
+ */
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ buf = state->xmit.buf;
+ state->xmit.buf = NULL;
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+
+ free_page((unsigned long)buf);
+
+@@ -1927,10 +1927,10 @@
+ */
+ if (WARN_ON(!uport))
+ return true;
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ uart_enable_ms(uport);
+ mctrl = uport->ops->get_mctrl(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ uart_port_deref(uport);
+
+ return mctrl & TIOCM_CAR;
+@@ -2047,9 +2047,9 @@
+ pm_state = state->pm_state;
+ if (pm_state != UART_PM_STATE_ON)
+ uart_change_pm(state, UART_PM_STATE_ON);
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ status = uport->ops->get_mctrl(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ if (pm_state != UART_PM_STATE_ON)
+ uart_change_pm(state, pm_state);
+
+@@ -2388,9 +2388,9 @@
+ */
+ if (!console_suspend_enabled && uart_console(uport)) {
+ if (uport->ops->start_rx) {
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ uport->ops->stop_rx(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ }
+ goto unlock;
+ }
+@@ -2405,7 +2405,7 @@
+ tty_port_set_suspended(port, true);
+ tty_port_set_initialized(port, false);
+
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ ops->stop_tx(uport);
+ if (!(uport->rs485.flags & SER_RS485_ENABLED))
+ ops->set_mctrl(uport, 0);
+@@ -2413,7 +2413,7 @@
+ mctrl = uport->mctrl;
+ uport->mctrl = 0;
+ ops->stop_rx(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+
+ /*
+ * Wait for the transmitter to empty.
+@@ -2485,9 +2485,9 @@
+ uart_change_pm(state, UART_PM_STATE_ON);
+ uport->ops->set_termios(uport, &termios, NULL);
+ if (!console_suspend_enabled && uport->ops->start_rx) {
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ uport->ops->start_rx(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ }
+ if (console_suspend_enabled)
+ console_start(uport->cons);
+@@ -2498,10 +2498,10 @@
+ int ret;
+
+ uart_change_pm(state, UART_PM_STATE_ON);
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ if (!(uport->rs485.flags & SER_RS485_ENABLED))
+ ops->set_mctrl(uport, 0);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ if (console_suspend_enabled || !uart_console(uport)) {
+ /* Protected by port mutex for now */
+ struct tty_struct *tty = port->tty;
+@@ -2511,11 +2511,11 @@
+ if (tty)
+ uart_change_line_settings(tty, state, NULL);
+ uart_rs485_config(uport);
+- spin_lock_irq(&uport->lock);
++ uart_port_lock_irq(uport);
+ if (!(uport->rs485.flags & SER_RS485_ENABLED))
+ ops->set_mctrl(uport, uport->mctrl);
+ ops->start_tx(uport);
+- spin_unlock_irq(&uport->lock);
++ uart_port_unlock_irq(uport);
+ tty_port_set_initialized(port, true);
+ } else {
+ /*
+@@ -2618,11 +2618,11 @@
+ * keep the DTR setting that is set in uart_set_options()
+ * We probably don't need a spinlock around this, but
+ */
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ port->mctrl &= TIOCM_DTR;
+ if (!(port->rs485.flags & SER_RS485_ENABLED))
+ port->ops->set_mctrl(port, port->mctrl);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ uart_rs485_config(port);
+
+--- a/drivers/tty/serial/serial_port.c
++++ b/drivers/tty/serial/serial_port.c
+@@ -35,10 +35,10 @@
+ goto out;
+
+ /* Flush any pending TX for the port */
+- spin_lock_irqsave(&port->lock, flags);
++ uart_port_lock_irqsave(port, &flags);
+ if (__serial_port_busy(port))
+ port->ops->start_tx(port);
+- spin_unlock_irqrestore(&port->lock, flags);
++ uart_port_unlock_irqrestore(port, flags);
+
+ out:
+ pm_runtime_mark_last_busy(dev);