With CONFIG_PREEMPT_RT_FULL the tty_flip_buffer_push(..) actions are executed immeditely (same behaviour as if low_latency flag was set). We thus have to release port_lock before callng tty_flip_buffer_push(). This issue resultst of commits: 44a0c019: USB: g_serial: don't set low_latency flag dc0cbd1b: serial: 8250: Call flush_to_ldisc when the irq is threaded Signed-off-by: Jean-Jacques Hiblot <jjhiblot@xxxxxxxxxxxxxxx> --- changes since v1: - fix compilation problem: use port.tty instead of port->port_tty drivers/usb/gadget/u_serial.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index b369292..3d4246d 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c @@ -549,12 +549,25 @@ static void gs_rx_push(unsigned long _port) port->read_started--; } - /* Push from tty to ldisc; without low_latency set this is handled by - * a workqueue, so we won't get callbacks and can hold port_lock - */ - if (do_push) + /* Push from tty to ldisc */ + if (do_push) { +#ifndef CONFIG_PREEMPT_RT_FULL + /* without low_latency set this is handled by a workqueue, so + * we won't get callbacks and can hold port_lock + */ tty_flip_buffer_push(&port->port); - +#else + /* CONFIG_PREEMPT_RT_FULL makes this a synchronous action. and + * it may trigger synchronous callbacks to this driver. We need + * to release the lock. + */ + spin_unlock_irq(&port->port_lock); + tty_flip_buffer_push(&port->port); + spin_lock_irq(&port->port_lock); + /* tty may have been closed */ + tty = port->port.tty; +#endif + } /* We want our data queue to become empty ASAP, keeping data * in the tty and ldisc (not here). If we couldn't push any -- 1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html