2008-10-21 06:33:07

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Bug in "genirq: record trigger type"

On Mon, 2008-10-20 at 22:05 +0000, Linux Kernel Mailing List wrote:
> Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0c5d1eb77a8be917b638344a22afe1398236482b
> Commit: 0c5d1eb77a8be917b638344a22afe1398236482b
> Parent: d6d5aeb661fc14655c417f3582ae7ec52985d2a8
> Author: David Brownell <[email protected]>
> AuthorDate: Wed Oct 1 14:46:18 2008 -0700
> Committer: Ingo Molnar <[email protected]>
> CommitDate: Thu Oct 2 10:24:09 2008 +0200

This one is obviously broken and breaks booting on a whole bunch of
machines (including powermac's and thus my G5, it's never good when my
own machine breaks !).

Nice to see 3 SOB's and one Ack and nobody caught the obvious bug :-)

> desc = irq_desc + irq;
> - if (desc->chip->set_type) {
> - spin_lock_irqsave(&desc->lock, flags);
> - ret = desc->chip->set_type(irq, type);
> - spin_unlock_irqrestore(&desc->lock, flags);
> - }
> + if (type == IRQ_TYPE_NONE)
> + return 0;
> +
> + spin_lock_irqsave(&desc->lock, flags);
> + ret = __irq_set_trigger(desc, irq, flags);
^^^^ type maybe ?

> + spin_unlock_irqrestore(&desc->lock, flags);
> return ret;
> }

I have to run so no patch until tomorrow unless somebody beats me to it.

Cheers,
Ben.


2008-10-21 07:22:31

by Yinghai Lu

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"

On Mon, Oct 20, 2008 at 11:32 PM, Benjamin Herrenschmidt
<[email protected]> wrote:
> On Mon, 2008-10-20 at 22:05 +0000, Linux Kernel Mailing List wrote:
>> Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0c5d1eb77a8be917b638344a22afe1398236482b
>> Commit: 0c5d1eb77a8be917b638344a22afe1398236482b
>> Parent: d6d5aeb661fc14655c417f3582ae7ec52985d2a8
>> Author: David Brownell <[email protected]>
>> AuthorDate: Wed Oct 1 14:46:18 2008 -0700
>> Committer: Ingo Molnar <[email protected]>
>> CommitDate: Thu Oct 2 10:24:09 2008 +0200
>
> This one is obviously broken and breaks booting on a whole bunch of
> machines (including powermac's and thus my G5, it's never good when my
> own machine breaks !).
>
> Nice to see 3 SOB's and one Ack and nobody caught the obvious bug :-)
>
>> desc = irq_desc + irq;
>> - if (desc->chip->set_type) {
>> - spin_lock_irqsave(&desc->lock, flags);
>> - ret = desc->chip->set_type(irq, type);
>> - spin_unlock_irqrestore(&desc->lock, flags);
>> - }
>> + if (type == IRQ_TYPE_NONE)
>> + return 0;
>> +
>> + spin_lock_irqsave(&desc->lock, flags);
>> + ret = __irq_set_trigger(desc, irq, flags);
> ^^^^ type maybe ?
>
>> + spin_unlock_irqrestore(&desc->lock, flags);
>> return ret;
>> }
>
> I have to run so no patch until tomorrow unless somebody beats me to it.

there is patch about it, but somehow get lost.

YH

2008-10-21 07:24:22

by Ingo Molnar

[permalink] [raw]
Subject: [PATCH] genirq: fix set_irq_type() when recording trigger type


* Benjamin Herrenschmidt <[email protected]> wrote:

> On Mon, 2008-10-20 at 22:05 +0000, Linux Kernel Mailing List wrote:
> > Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0c5d1eb77a8be917b638344a22afe1398236482b
> > Commit: 0c5d1eb77a8be917b638344a22afe1398236482b
> > Parent: d6d5aeb661fc14655c417f3582ae7ec52985d2a8
> > Author: David Brownell <[email protected]>
> > AuthorDate: Wed Oct 1 14:46:18 2008 -0700
> > Committer: Ingo Molnar <[email protected]>
> > CommitDate: Thu Oct 2 10:24:09 2008 +0200
[...]
> > Signed-off-by: David Brownell <[email protected]>
> > Signed-off-by: Andrew Morton <[email protected]>
> > Acked-by: Thomas Gleixner <[email protected]>
> > Signed-off-by: Ingo Molnar <[email protected]>
>
> This one is obviously broken and breaks booting on a whole bunch of
> machines (including powermac's and thus my G5, it's never good when my
> own machine breaks !).
>
> Nice to see 3 SOB's and one Ack and nobody caught the obvious bug :-)

that patch came from -mm towards us shortly before the merge window.
Once we had it integrated Chris Friesen reported a boot hang on a G5,
and there's a fix pending for the bug, see it below.

Will send it to Linus expressly. Fortunately only a minority of Linux
users will ever run a box that uses set_irq_type() - but yes it needs to
be fixed.

Ingo

------------------------------>
>From aac4ddd11a8d0e402ddc3fbc75204cb64efa0aac Mon Sep 17 00:00:00 2001
From: Chris Friesen <[email protected]>
Date: Mon, 20 Oct 2008 12:41:58 -0600
Subject: [PATCH] genirq: fix set_irq_type() when recording trigger type

In set_irq_type() we want to pass the type rather than the current
interrupt state.

Signed-off-by: Chris Friesen <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
---
kernel/irq/chip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 4895fde..3de6ea3 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -127,7 +127,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
return 0;

spin_lock_irqsave(&desc->lock, flags);
- ret = __irq_set_trigger(desc, irq, flags);
+ ret = __irq_set_trigger(desc, irq, type);
spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}

2008-10-21 07:29:28

by Ingo Molnar

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"


* Yinghai Lu <[email protected]> wrote:

> On Mon, Oct 20, 2008 at 11:32 PM, Benjamin Herrenschmidt
> <[email protected]> wrote:
> > On Mon, 2008-10-20 at 22:05 +0000, Linux Kernel Mailing List wrote:
> >> Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0c5d1eb77a8be917b638344a22afe1398236482b
> >> Commit: 0c5d1eb77a8be917b638344a22afe1398236482b
> >> Parent: d6d5aeb661fc14655c417f3582ae7ec52985d2a8
> >> Author: David Brownell <[email protected]>
> >> AuthorDate: Wed Oct 1 14:46:18 2008 -0700
> >> Committer: Ingo Molnar <[email protected]>
> >> CommitDate: Thu Oct 2 10:24:09 2008 +0200
> >
> > This one is obviously broken and breaks booting on a whole bunch of
> > machines (including powermac's and thus my G5, it's never good when my
> > own machine breaks !).
> >
> > Nice to see 3 SOB's and one Ack and nobody caught the obvious bug :-)
> >
> >> desc = irq_desc + irq;
> >> - if (desc->chip->set_type) {
> >> - spin_lock_irqsave(&desc->lock, flags);
> >> - ret = desc->chip->set_type(irq, type);
> >> - spin_unlock_irqrestore(&desc->lock, flags);
> >> - }
> >> + if (type == IRQ_TYPE_NONE)
> >> + return 0;
> >> +
> >> + spin_lock_irqsave(&desc->lock, flags);
> >> + ret = __irq_set_trigger(desc, irq, flags);
> > ^^^^ type maybe ?
> >
> >> + spin_unlock_irqrestore(&desc->lock, flags);
> >> return ret;
> >> }
> >
> > I have to run so no patch until tomorrow unless somebody beats me to it.
>
> there is patch about it, but somehow get lost.

should be all sorted now, the fix is below.

Ingo

------------------>
>From aac4ddd11a8d0e402ddc3fbc75204cb64efa0aac Mon Sep 17 00:00:00 2001
From: Chris Friesen <[email protected]>
Date: Mon, 20 Oct 2008 12:41:58 -0600
Subject: [PATCH] genirq: fix set_irq_type() when recording trigger type

In set_irq_type() we want to pass the type rather than the current
interrupt state.

Signed-off-by: Chris Friesen <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
---
kernel/irq/chip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 4895fde..3de6ea3 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -127,7 +127,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
return 0;

spin_lock_irqsave(&desc->lock, flags);
- ret = __irq_set_trigger(desc, irq, flags);
+ ret = __irq_set_trigger(desc, irq, type);
spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}

2008-10-21 07:33:27

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"

On Tue, 2008-10-21 at 09:28 +0200, Ingo Molnar wrote:

> From: Chris Friesen <[email protected]>
> Date: Mon, 20 Oct 2008 12:41:58 -0600
> Subject: [PATCH] genirq: fix set_irq_type() when recording trigger type
>
> In set_irq_type() we want to pass the type rather than the current
> interrupt state.
>
> Signed-off-by: Chris Friesen <[email protected]>
> Signed-off-by: Ingo Molnar <[email protected]>

Acked-by: Benjamin Herrenschmidt <[email protected]>

> ---
> kernel/irq/chip.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index 4895fde..3de6ea3 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -127,7 +127,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
> return 0;
>
> spin_lock_irqsave(&desc->lock, flags);
> - ret = __irq_set_trigger(desc, irq, flags);
> + ret = __irq_set_trigger(desc, irq, type);
> spin_unlock_irqrestore(&desc->lock, flags);
> return ret;
> }

2008-10-21 07:34:33

by Ingo Molnar

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"


* Benjamin Herrenschmidt <[email protected]> wrote:

> On Tue, 2008-10-21 at 09:28 +0200, Ingo Molnar wrote:
>
> > From: Chris Friesen <[email protected]>
> > Date: Mon, 20 Oct 2008 12:41:58 -0600
> > Subject: [PATCH] genirq: fix set_irq_type() when recording trigger type
> >
> > In set_irq_type() we want to pass the type rather than the current
> > interrupt state.
> >
> > Signed-off-by: Chris Friesen <[email protected]>
> > Signed-off-by: Ingo Molnar <[email protected]>
>
> Acked-by: Benjamin Herrenschmidt <[email protected]>

thx, added your ack to the commit as well.

Ingo

2008-10-21 08:01:43

by David Brownell

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"

On Monday 20 October 2008, Benjamin Herrenschmidt wrote:
> This one is obviously broken and breaks booting on a whole bunch of
> machines (including powermac's and thus my G5, it's never good when my
> own machine breaks !).
>
> Nice to see 3 SOB's and one Ack and nobody caught the obvious bug :-)

As you saw, that one's fixed. Chris' patch unfortunately didn't
get integrated right away.


I'm a bit more curious about another potential issue though ... as
described in the patch comment:

- Make set_irq_type() usage match request_irq() usage:
* IRQ_TYPE_NONE should be a NOP; succeed, so irq_chip methods
won't have to handle that case any more (many do it wrong).

It might be a bit more accurate to say irq_chip.set_type() methods
are *inconsistent* in handling IRQ_TYPE_NONE. Previously the
set_irq_type() method would pass that down to irq_chip code.

I had observed two behaviors, but I thought I observed a third one
in some of the PowerPC code:

(1) ignore it ... matching request_irq() usage
(2) return an error ... nasty
(3) assign some irq_chip-specific trigger mode

That third behavior might cause a bit of trouble, but I think
it was only used during platform init. Someone more attuned
to PowerPC might want to check ...

- Dave

2008-10-21 08:31:26

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: Bug in "genirq: record trigger type"

On Tue, 2008-10-21 at 01:01 -0700, David Brownell wrote:
>
> I'm a bit more curious about another potential issue though ... as
> described in the patch comment:
>
> - Make set_irq_type() usage match request_irq() usage:
> * IRQ_TYPE_NONE should be a NOP; succeed, so irq_chip methods
> won't have to handle that case any more (many do it wrong).
>
> It might be a bit more accurate to say irq_chip.set_type() methods
> are *inconsistent* in handling IRQ_TYPE_NONE. Previously the
> set_irq_type() method would pass that down to irq_chip code.
>
> I had observed two behaviors, but I thought I observed a third one
> in some of the PowerPC code:
>
> (1) ignore it ... matching request_irq() usage
> (2) return an error ... nasty
> (3) assign some irq_chip-specific trigger mode
>
> That third behavior might cause a bit of trouble, but I think
> it was only used during platform init. Someone more attuned
> to PowerPC might want to check ...

Ok, I wrote a lot of the port of powerpc stuff to genirq so I supposed
I'm the person to do that sweep :-) I'll have a look tomorrow.

Thanks for the heads up,

Cheers,
Ben.