A few driver do in their console_write() callback something like | local_irq_save(flags); | if (sysrq) | locked = 0; | else if (oops_in_progress) | locked = uart_port_trylock(port); | else | uart_port_lock(port); which breaks on PREEMPT_RT because the uart_port lock becomes a sleeping lock and it can not be acquired with disabled interrupts. The PREEMPT_RT queue has workarounds for a few of them. I tackled ever UART driver with that pattern. The changes are mostly the same: - Replace direct sysrq handling with delayed by using uart_prepare_sysrq_char(). This removes the first 'if (sysrq)' check. - Remove local_irq_save() und use the _irqsave suffix for both of the locking functions. The drivers can be categorized as - Did not handle sysrq at all but does now - lpc32xx_hs - owl - rda - sifive - Dropped the uart_port while invoking the sysrq callback but console_write did not acquire uart_port-lock as it should. - amba-pl011 - msm - rda Don't think this is a serious problem. - The IRQ service routine is always invoked with disabled interrupts and the _irqsave() suffix was dropped while switching to uart_prepare_sysrq_char(). - msm - owl - Nothing special, just converted - ar933x - bcm63xx - meson - omap - pxa - sunplus - Required love & cuddling to get on track - pch The series has been compiles tested on x86-64, arm, arm64. Sebastian