blob: e4c37b7364b94d610c1a5a1330b01a4fedebfd10 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
From 4eb7f5c7d5dfe90eec3a505534fb7eca31a241fd 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>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
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
|