From: Bernhard Walle <bwalle@suse.de>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, Vivek Goyal <vgoyal@in.ibm.com>
Subject: [PATCH] Fix crash with irqpoll due to the IRQF_IRQPOLL flag
Date: Tue, 22 May 2007 10:37:56 +0200 [thread overview]
Message-ID: <20070522083756.GB18498@suse.de> (raw)
In-Reply-To: <20070514140513.GD29616@suse.de>
o System crashes if booted with irqpoll command line option.
o Problem happens because Inside note_interrupt() we are accessing
desc->action->flag without taking the desc->lock. While accessing it
somebody goes ahead and unregisters the irq handler hence desc->action
is NULL. By the time note_interrupt() checks it, it crashes.
o In that system it is irq 4 seriving to serial driver.
o Take the desc->lock before accessing desc->action->flag.
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
---
linux-2.6.21-git12-root/kernel/irq/spurious.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff -puN kernel/irq/spurious.c~fix-irqpoll-crash kernel/irq/spurious.c
--- linux-2.6.21-git12/kernel/irq/spurious.c~fix-irqpoll-crash 2007-05-17 17:36:50.000000000 +0530
+++ linux-2.6.21-git12-root/kernel/irq/spurious.c 2007-05-17 17:53:52.000000000 +0530
@@ -138,6 +138,8 @@ report_bad_irq(unsigned int irq, struct
void note_interrupt(unsigned int irq, struct irq_desc *desc,
irqreturn_t action_ret)
{
+ int call_misrouted_irq = 0;
+
if (unlikely(action_ret != IRQ_HANDLED)) {
desc->irqs_unhandled++;
if (unlikely(action_ret != IRQ_NONE))
@@ -146,9 +148,24 @@ void note_interrupt(unsigned int irq, st
if (unlikely(irqfixup)) {
/* Don't punish working computers */
- if ((irqfixup == 2 && ((irq == 0) ||
- (desc->action->flags & IRQF_IRQPOLL))) ||
- action_ret == IRQ_NONE) {
+ if (action_ret == IRQ_NONE)
+ /* Nobody handled irq. Possibly a misrouted one. */
+ call_misrouted_irq = 1;
+ else if (irqfixup == 2) {
+ /* irqpoll is enabled. Is this the irq driving
+ * polling.
+ */
+ if (irq == 0)
+ call_misrouted_irq = 1;
+ else {
+ spin_lock(&desc->lock);
+ if (desc->action &&
+ (desc->action->flags & IRQF_IRQPOLL))
+ call_misrouted_irq = 1;
+ spin_unlock(&desc->lock);
+ }
+ }
+ if (call_misrouted_irq) {
int ok = misrouted_irq(irq);
if (action_ret == IRQ_NONE)
desc->irqs_unhandled -= ok;
_
next prev parent reply other threads:[~2007-05-22 8:38 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-26 9:36 2.6.21-rc7-mm2 "irqpoll" seems to be broken Vivek Goyal
2007-04-26 15:24 ` Andrew Morton
2007-04-26 15:43 ` Bernhard Walle
2007-04-30 8:48 ` Vivek Goyal
2007-05-01 19:20 ` Bernhard Walle
[not found] ` <20070502221932.GA488@suse.de>
2007-05-08 17:18 ` Vivek Goyal
2007-05-14 14:05 ` Bernhard Walle
2007-05-17 13:05 ` Vivek Goyal
2007-05-17 21:56 ` Bernhard Walle
2007-05-22 8:37 ` Bernhard Walle [this message]
2007-05-23 16:01 ` [PATCH] Fix crash with irqpoll due to the IRQF_IRQPOLL flag Linus Torvalds
2007-05-24 5:28 ` Vivek Goyal
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=20070522083756.GB18498@suse.de \
--to=bwalle@suse.de \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=vgoyal@in.ibm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.