From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: linux-serial@vger.kernel.org
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>, Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org
Subject: [PATCH -rt] serial: 8250: fix shared interrupts issues under RT kernels
Date: Tue, 24 Jun 2008 03:29:57 +0400 [thread overview]
Message-ID: <20080623232957.GA5111@polina.dev.rtsoft.ru> (raw)
8250's initialization routines relies on the fact that _irqsave spinlock
will disable local hardirqs, so that the driver can issue IRQ-triggering
operations before registering the port in the IRQ chain.
With RT kernels and preemptable hardirqs this isn't true, _irqsave
spinlock does not disable local hardirqs, and this causes following
trace:
$ cat /dev/ttyS1
irq 42: nobody cared (try booting with the "irqpoll" option)
Call Trace:
[C0475EB0] [C0008A98] show_stack+0x4c/0x1ac (unreliable)
[C0475EF0] [C004BBD4] __report_bad_irq+0x34/0xb8
[C0475F10] [C004BD38] note_interrupt+0xe0/0x308
[C0475F50] [C004B09C] thread_simple_irq+0xdc/0x104
[C0475F70] [C004B3FC] do_irqd+0x338/0x3c8
[C0475FC0] [C00398E0] kthread+0xf8/0x100
[C0475FF0] [C0011FE0] original_kernel_thread+0x44/0x60
handlers:
[<c02112c4>] (serial8250_interrupt+0x0/0x138)
Disabling IRQ #42
After this, all serial ports on the given IRQ are non-functional.
To fix the issue we should explicitly disable shared IRQ before
issuing any IRQ-triggering operations.
I also changed spin_lock_irqsave to the ordinary spin_lock, since it
seems to be safe: chain does not contain new port (yet), thus nobody
will interfere us from the ISRs.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---
drivers/serial/8250.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 76ccef7..702e0d3 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -1831,7 +1831,9 @@ static int serial8250_startup(struct uart_port *port)
* the interrupt is enabled. Delays are necessary to
* allow register changes to become visible.
*/
- spin_lock_irqsave(&up->port.lock, flags);
+ spin_lock(&up->port.lock);
+ if (up->port.flags & UPF_SHARE_IRQ)
+ disable_irq(up->port.irq);
wait_for_xmitr(up, UART_LSR_THRE);
serial_out_sync(up, UART_IER, UART_IER_THRI);
@@ -1843,7 +1845,9 @@ static int serial8250_startup(struct uart_port *port)
iir = serial_in(up, UART_IIR);
serial_out(up, UART_IER, 0);
- spin_unlock_irqrestore(&up->port.lock, flags);
+ if (up->port.flags & UPF_SHARE_IRQ)
+ enable_irq(up->port.irq);
+ spin_unlock(&up->port.lock);
/*
* If the interrupt is not reasserted, setup a timer to
--
1.5.5.4
next reply other threads:[~2008-06-23 23:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-23 23:29 Anton Vorontsov [this message]
2008-06-24 0:12 ` [PATCH -rt] serial: 8250: fix shared interrupts issues under RT kernels Ingo Molnar
2008-07-01 13:43 ` [PATCH] serial: 8250: fix shared interrupts issues with SMP and " Anton Vorontsov
2008-07-01 13:43 ` Alan Cox
2008-07-01 15:02 ` [PATCH v2] " Anton Vorontsov
2008-07-09 19:29 ` Anton Vorontsov
2008-07-09 19:21 ` Alan Cox
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080623232957.GA5111@polina.dev.rtsoft.ru \
--to=avorontsov@ru.mvista.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox