aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-07-03 09:30:01 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-07-29 17:30:37 -0400
commit7f36d9deaafb246caadc3a94d785e9d856209e01 (patch)
tree5b0213738523c09688641583405b11bf7d9721e0
parent295048108ae1c03ede2297c08133526c5a1b6b3b (diff)
drivers/serial: call flush_to_ldisc when the irq is threaded
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--drivers/char/tty_buffer.c4
-rw-r--r--drivers/serial/8250.c7
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/char/tty_buffer.c b/drivers/char/tty_buffer.c
index 810ee25d66a4..fdd854206863 100644
--- a/drivers/char/tty_buffer.c
+++ b/drivers/char/tty_buffer.c
@@ -482,10 +482,14 @@ void tty_flip_buffer_push(struct tty_struct *tty)
482 tty->buf.tail->commit = tty->buf.tail->used; 482 tty->buf.tail->commit = tty->buf.tail->used;
483 spin_unlock_irqrestore(&tty->buf.lock, flags); 483 spin_unlock_irqrestore(&tty->buf.lock, flags);
484 484
485#ifndef CONFIG_PREEMPT_RT
485 if (tty->low_latency) 486 if (tty->low_latency)
486 flush_to_ldisc(&tty->buf.work.work); 487 flush_to_ldisc(&tty->buf.work.work);
487 else 488 else
488 schedule_delayed_work(&tty->buf.work, 1); 489 schedule_delayed_work(&tty->buf.work, 1);
490#else
491 flush_to_ldisc(&tty->buf.work.work);
492#endif
489} 493}
490EXPORT_SYMBOL(tty_flip_buffer_push); 494EXPORT_SYMBOL(tty_flip_buffer_push);
491 495
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index a1f403ec9213..d4d69e155afe 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -1595,7 +1595,12 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
1595 1595
1596 l = l->next; 1596 l = l->next;
1597 1597
1598 if (l == i->head && pass_counter++ > PASS_LIMIT) { 1598 /*
1599 * On preempt-rt we can be preempted and run in our
1600 * own thread.
1601 */
1602 if (!preempt_rt() && l == i->head &&
1603 pass_counter++ > PASS_LIMIT) {
1599 /* If we hit this, we're dead. */ 1604 /* If we hit this, we're dead. */
1600 printk(KERN_ERR "serial8250: too much work for " 1605 printk(KERN_ERR "serial8250: too much work for "
1601 "irq%d\n", irq); 1606 "irq%d\n", irq);