FAILED: patch "[PATCH] tty: xilinx_uartps: split sysrq handling" failed to apply to 6.6-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x b06f388994500297bb91be60ffaf6825ecfd2afe
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025020949-press-evolve-b900@gregkh' --subject-prefix 'PATCH 6.6.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b06f388994500297bb91be60ffaf6825ecfd2afe Mon Sep 17 00:00:00 2001
From: Sean Anderson <[email protected]>
Date: Fri, 10 Jan 2025 16:38:22 -0500
Subject: [PATCH] tty: xilinx_uartps: split sysrq handling
lockdep detects the following circular locking dependency:
CPU 0 CPU 1
========================== ============================cdns_uart_isr() printk()
uart_port_lock(port) console_lock()
cdns_uart_console_write()
if (!port->sysrq)
uart_port_lock(port)
uart_handle_break()
port->sysrq = ... uart_handle_sysrq_char()
printk()
console_lock()
The fixed commit attempts to avoid this situation by only taking the port lock in cdns_uart_console_write if port->sysrq unset. However, if (as shown above) cdns_uart_console_write runs before port->sysrq is set, then it will try to take the port lock anyway. This may result in a deadlock.
Fix this by splitting sysrq handling into two parts. We use the prepare helper under the port lock and defer handling until we release the lock.
drivers/tty/serial/xilinx_uartps.c +3 -5
@@ -287,7 +287,7 @@ static void cdns_uart_handle_rx(void *dev_id, unsigned int isrstatus)continue ; } -if (uart_handle_sysrq_char (port, data)) +if (uart_prepare_sysrq_char (port, data))continue ;if (is_rxbs_support) {
@@ -495,7 +495,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))cdns_uart_handle_rx (dev_id, isrstatus); -uart_port_unlock (port); +uart_unlock_and_check_sysrq (port);return IRQ_HANDLED ; }
@@ -1380,9 +1380,7 @@ static void cdns_uart_console_write(struct console *co, const char *s,unsigned int imr, ctrl;int locked =1 ; -if (port->sysrq) - locked =0 ; -else if (oops_in_progress) +if (oops_in_progress) locked =uart_port_trylock_irqsave (port, &flags);else uart_port_lock_irqsave (port, &flags);
PATCH 1/1 tty: xilinx_uartps: split sysrq handling
lockdep detects the following circular locking dependency:
CPU 0 CPU 1
========================== ============================cdns_uart_isr() printk()
uart_port_lock(port) console_lock()
cdns_uart_console_write()
if (!port->sysrq)
uart_port_lock(port)
uart_handle_break()
port->sysrq = ... uart_handle_sysrq_char()
printk()
console_lock()
The fixed commit attempts to avoid this situation by only taking the port lock in cdns_uart_console_write if port->sysrq unset. However, if (as shown above) cdns_uart_console_write runs before port->sysrq is set, then it will try to take the port lock anyway. This may result in a deadlock.
Fix this by splitting sysrq handling into two parts. We use the prepare helper under the port lock and defer handling until we release the lock.
---
drivers/tty/serial/xilinx_uartps.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/tty/serial/xilinx_uartps.c +4 -6
@@ -268,7 +268,7 @@ static void cdns_uart_handle_rx(void *dev_id, unsigned int isrstatus)continue ; } -if (uart_handle_sysrq_char (port, data)) +if (uart_prepare_sysrq_char (port, data))continue ;if (is_rxbs_support) {
@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))cdns_uart_handle_rx (dev_id, isrstatus); -spin_unlock (&port->lock); +uart_unlock_and_check_sysrq (port);return IRQ_HANDLED ; }
@@ -1229,10 +1229,8 @@ static void cdns_uart_console_write(struct console *co, const char *s,unsigned int imr, ctrl;int locked =1 ; -if (port->sysrq) - locked =0 ; -else if (oops_in_progress) - locked =spin_trylock_irqsave (&port->lock, flags); +if (oops_in_progress) + locked =uart_port_trylock_irqsave (port, &flags);else spin_lock_irqsave (&port->lock, flags);
Signature · 1 line
2.35.1.1320.gc452695387.dirty
PATCH v2 1/1 tty: xilinx_uartps: split sysrq handling
commit b06f388994500297bb91be60ffaf6825ecfd2afe upstream
lockdep detects the following circular locking dependency:
CPU 0 CPU 1
========================== ============================cdns_uart_isr() printk()
uart_port_lock(port) console_lock()
cdns_uart_console_write()
if (!port->sysrq)
uart_port_lock(port)
uart_handle_break()
port->sysrq = ... uart_handle_sysrq_char()
printk()
console_lock()
The fixed commit attempts to avoid this situation by only taking the port lock in cdns_uart_console_write if port->sysrq unset. However, if (as shown above) cdns_uart_console_write runs before port->sysrq is set, then it will try to take the port lock anyway. This may result in a deadlock.
Fix this by splitting sysrq handling into two parts. We use the prepare helper under the port lock and defer handling until we release the lock.
---
Changes in v2:
- Add missing "commit ... upstream" line
drivers/tty/serial/xilinx_uartps.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/tty/serial/xilinx_uartps.c +4 -6
@@ -268,7 +268,7 @@ static void cdns_uart_handle_rx(void *dev_id, unsigned int isrstatus)continue ; } -if (uart_handle_sysrq_char (port, data)) +if (uart_prepare_sysrq_char (port, data))continue ;if (is_rxbs_support) {
@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))cdns_uart_handle_rx (dev_id, isrstatus); -spin_unlock (&port->lock); +uart_unlock_and_check_sysrq (port);return IRQ_HANDLED ; }
@@ -1229,10 +1229,8 @@ static void cdns_uart_console_write(struct console *co, const char *s,unsigned int imr, ctrl;int locked =1 ; -if (port->sysrq) - locked =0 ; -else if (oops_in_progress) - locked =spin_trylock_irqsave (&port->lock, flags); +if (oops_in_progress) + locked =uart_port_trylock_irqsave (port, &flags);else spin_lock_irqsave (&port->lock, flags);
Signature · 1 line
2.35.1.1320.gc452695387.dirty