| From 0e42d26f9cf75079dae4c99c734dc6e99b7258eb Mon Sep 17 00:00:00 2001 |
| From: Ingo Molnar <mingo@elte.hu> |
| 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 <mingo@elte.hu> |
| |
| diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c |
| index 66fa4e1..17dfa02 100644 |
| --- a/drivers/char/tty_buffer.c |
| +++ b/drivers/char/tty_buffer.c |
| @@ -492,10 +492,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 e348e3c..708b6d9 100644 |
| --- a/drivers/serial/8250.c |
| +++ b/drivers/serial/8250.c |
| @@ -1598,7 +1598,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.1.1 |
| |