serial: 8250_dw: dispatch SysRq character in dw8250_handle_irq()
dw8250_handle_irq() calls serial8250_handle_irq_locked() with the port lock held via guard(uart_port_lock_irqsave). The guard destructor is plain uart_port_unlock_irqrestore(), so a SysRq character captured into port->sysrq_ch by uart_prepare_sysrq_char() is dropped without ever being dispatched to handle_sysrq(). This is the same regression pattern as in serial8250_handle_irq(), introduced whenmaster883c5a2bc9("serial: 8250_dw: Rework dw8250_handle_irq() locking and IIR handling") moved the function to the guard()-based locking scheme without using the sysrq-aware unlock helper. Switch to guard(uart_port_lock_check_sysrq_irqsave) so that captured sysrq_ch is dispatched on scope exit, matching the fix in serial8250_handle_irq(). Fixes:883c5a2bc9("serial: 8250_dw: Rework dw8250_handle_irq() locking and IIR handling") Cc: stable@vger.kernel.org Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Jacques Nilo <jnilo@free.fr> Link: https://patch.msgid.link/ed56fcaf4af24e4ed011a7bce206e0182acb761c.1778675349.git.jnilo@free.fr Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
71f42b2149
commit
2e21172395
|
|
@ -427,7 +427,7 @@ static int dw8250_handle_irq(struct uart_port *p)
|
|||
unsigned int quirks = d->pdata->quirks;
|
||||
unsigned int status;
|
||||
|
||||
guard(uart_port_lock_irqsave)(p);
|
||||
guard(uart_port_lock_check_sysrq_irqsave)(p);
|
||||
|
||||
switch (FIELD_GET(DW_UART_IIR_IID, iir)) {
|
||||
case UART_IIR_NO_INT:
|
||||
|
|
|
|||
Loading…
Reference in New Issue