From 4eb7f5c7d5dfe90eec3a505534fb7eca31a241fd Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:01 -0500 Subject: [PATCH] drivers/serial: call flush_to_ldisc when the irq is threaded commit 7f36d9deaafb246caadc3a94d785e9d856209e01 in tip. Signed-off-by: Ingo Molnar Signed-off-by: Paul Gortmaker --- drivers/char/tty_buffer.c | 4 ++++ drivers/serial/8250.c | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletions(-) diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c index 7ee5216..019a8c0 100644 --- a/drivers/char/tty_buffer.c +++ b/drivers/char/tty_buffer.c @@ -495,10 +495,14 @@ void tty_flip_buffer_push(struct tty_struct *tty) tty->buf.tail->commit = tty->buf.tail->used; spin_unlock_irqrestore(&tty->buf.lock, flags); +#ifndef CONFIG_PREEMPT_RT if (tty->low_latency) flush_to_ldisc(&tty->buf.work.work); else schedule_delayed_work(&tty->buf.work, 1); +#else + flush_to_ldisc(&tty->buf.work.work); +#endif } EXPORT_SYMBOL(tty_flip_buffer_push); diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 42f05ea..c1d31e4 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c @@ -1593,7 +1593,12 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id) l = l->next; - if (l == i->head && pass_counter++ > PASS_LIMIT) { + /* + * On preempt-rt we can be preempted and run in our + * own thread. + */ + if (!preempt_rt() && l == i->head && + pass_counter++ > PASS_LIMIT) { /* If we hit this, we're dead. */ printk(KERN_ERR "serial8250: too much work for " "irq%d\n", irq); -- 1.7.0.4