diff mbox

ARM: GIC: dont warn on pre-allocated IRQ descs

Message ID 1348600794-2395-1-git-send-email-linus.walleij@stericsson.com (mailing list archive)
State New, archived
Headers show

Commit Message

Linus Walleij Sept. 25, 2012, 7:19 p.m. UTC
From: Linus Walleij <linus.walleij@linaro.org>

Currently, if you try to turn on CONFIG_SPARSE_IRQS for a platform
using the GIC, you will get this in your face:

------------[ cut here ]------------
WARNING: at /home/elinwal/linux-stericsson/arch/arm/common/gic.c:713 gic_init_bases+0xe8/0x290()
Cannot allocate irq_descs @ IRQ16, assuming pre-allocated
Modules linked in:
[<c0014710>] (unwind_backtrace+0x0/0xf8) from [<c001d304>] (warn_slowpath_common+0x4c/0x64)
[<c001d304>] (warn_slowpath_common+0x4c/0x64) from [<c001d3b0>] (warn_slowpath_fmt+0x30/0x40)
[<c001d3b0>] (warn_slowpath_fmt+0x30/0x40) from [<c03e60f8>] (gic_init_bases+0xe8/0x290)
[<c03e60f8>] (gic_init_bases+0xe8/0x290) from [<c03e6560>] (ux500_init_irq+0xb0/0xfc)
[<c03e6560>] (ux500_init_irq+0xb0/0xfc) from [<c03e2114>] (init_IRQ+0x14/0x1c)
[<c03e2114>] (init_IRQ+0x14/0x1c) from [<c03df698>] (start_kernel+0x198/0x2ec)
[<c03df698>] (start_kernel+0x198/0x2ec) from [<00008044>] (0x8044)
---[ end trace 1b75b31a2719ed1c ]---

This is because the GIC tries to allocate fresh IRQ descs for
its IRQs, and that would work with non-sparse IRQs but fails
with sparse IRQs because the .nr_irqs from the platform always
get pre-allocated at boot time.

The allocation will succeed if the platform define .nr_irqs
to 0 as an ideal device tree platform would do, but I think it
is a bit thick to require that every platform that wants to
use sparse IRQs must first or simultaneously switch to
device tree. So make this to a simple pr_debug().

Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 arch/arm/common/gic.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Rob Herring Sept. 25, 2012, 7:28 p.m. UTC | #1
On 09/25/2012 02:19 PM, Linus Walleij wrote:
> From: Linus Walleij <linus.walleij@linaro.org>
> 
> Currently, if you try to turn on CONFIG_SPARSE_IRQS for a platform
> using the GIC, you will get this in your face:
> 
> ------------[ cut here ]------------
> WARNING: at /home/elinwal/linux-stericsson/arch/arm/common/gic.c:713 gic_init_bases+0xe8/0x290()
> Cannot allocate irq_descs @ IRQ16, assuming pre-allocated
> Modules linked in:
> [<c0014710>] (unwind_backtrace+0x0/0xf8) from [<c001d304>] (warn_slowpath_common+0x4c/0x64)
> [<c001d304>] (warn_slowpath_common+0x4c/0x64) from [<c001d3b0>] (warn_slowpath_fmt+0x30/0x40)
> [<c001d3b0>] (warn_slowpath_fmt+0x30/0x40) from [<c03e60f8>] (gic_init_bases+0xe8/0x290)
> [<c03e60f8>] (gic_init_bases+0xe8/0x290) from [<c03e6560>] (ux500_init_irq+0xb0/0xfc)
> [<c03e6560>] (ux500_init_irq+0xb0/0xfc) from [<c03e2114>] (init_IRQ+0x14/0x1c)
> [<c03e2114>] (init_IRQ+0x14/0x1c) from [<c03df698>] (start_kernel+0x198/0x2ec)
> [<c03df698>] (start_kernel+0x198/0x2ec) from [<00008044>] (0x8044)
> ---[ end trace 1b75b31a2719ed1c ]---
> 
> This is because the GIC tries to allocate fresh IRQ descs for
> its IRQs, and that would work with non-sparse IRQs but fails
> with sparse IRQs because the .nr_irqs from the platform always
> get pre-allocated at boot time.
> 
> The allocation will succeed if the platform define .nr_irqs
> to 0 as an ideal device tree platform would do, but I think it
> is a bit thick to require that every platform that wants to
> use sparse IRQs must first or simultaneously switch to
> device tree. So make this to a simple pr_debug().

It's not a matter of switching to DT or not. It is a matter of whether
an irq_chip allocates it's descriptors or not either directly or
indirectly via irqdomain. The gic does this, so it is secondary
controllers which are the problem. A platform could allocate the ranges
needed for those controllers and leave a hole for the gic to allocate.

A prefer to leave this so platforms get fixed.

Rob

> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Rob Herring <rob.herring@calxeda.com>
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
>  arch/arm/common/gic.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
> index aa52699..fcda633 100644
> --- a/arch/arm/common/gic.c
> +++ b/arch/arm/common/gic.c
> @@ -707,7 +707,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
>  	gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */
>  	irq_base = irq_alloc_descs(irq_start, 16, gic_irqs, numa_node_id());
>  	if (IS_ERR_VALUE(irq_base)) {
> -		WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
> +		pr_debug("Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
>  		     irq_start);
>  		irq_base = irq_start;
>  	}
>
Linus Walleij Sept. 25, 2012, 8:08 p.m. UTC | #2
On Tue, Sep 25, 2012 at 9:28 PM, Rob Herring <robherring2@gmail.com> wrote:
> On 09/25/2012 02:19 PM, Linus Walleij wrote:

>> The allocation will succeed if the platform define .nr_irqs
>> to 0 as an ideal device tree platform would do, but I think it
>> is a bit thick to require that every platform that wants to
>> use sparse IRQs must first or simultaneously switch to
>> device tree. So make this to a simple pr_debug().
>
> It's not a matter of switching to DT or not. It is a matter of whether
> an irq_chip allocates it's descriptors or not either directly or
> indirectly via irqdomain.

Yeah OK that's true.

> The gic does this, so it is secondary
> controllers which are the problem. A platform could allocate the ranges
> needed for those controllers and leave a hole for the gic to allocate.
>
> A prefer to leave this so platforms get fixed.

Since the core kernel will allocate .nr_irqs on boot I guess
this means you have to define the machine's .nr_irqs to
zero or atleast < 16 so it doesn't overlap with those the
GIC wants to use.

So I'll try that, and ad-hoc allocate descriptors needed
above that range for drivers that are not yet allocating
their descriptors ...

One question though: the real fix is obviously for all
drivers exposing an irqchip to allocate its descriptors
dynamically with exlicit alloc_descs() or using the
linear irq domain instead of relying on pre-allocated
descriptors.

Should we patch all drivers to spit out similar warnings
then?

Yours,
Linus Walleij
Rob Herring Sept. 25, 2012, 9:55 p.m. UTC | #3
On 09/25/2012 03:08 PM, Linus Walleij wrote:
> On Tue, Sep 25, 2012 at 9:28 PM, Rob Herring <robherring2@gmail.com> wrote:
>> On 09/25/2012 02:19 PM, Linus Walleij wrote:
> 
>>> The allocation will succeed if the platform define .nr_irqs
>>> to 0 as an ideal device tree platform would do, but I think it
>>> is a bit thick to require that every platform that wants to
>>> use sparse IRQs must first or simultaneously switch to
>>> device tree. So make this to a simple pr_debug().
>>
>> It's not a matter of switching to DT or not. It is a matter of whether
>> an irq_chip allocates it's descriptors or not either directly or
>> indirectly via irqdomain.
> 
> Yeah OK that's true.
> 
>> The gic does this, so it is secondary
>> controllers which are the problem. A platform could allocate the ranges
>> needed for those controllers and leave a hole for the gic to allocate.
>>
>> A prefer to leave this so platforms get fixed.
> 
> Since the core kernel will allocate .nr_irqs on boot I guess
> this means you have to define the machine's .nr_irqs to
> zero or atleast < 16 so it doesn't overlap with those the
> GIC wants to use.

I believe the default of 0 causes NR_IRQS_LEGACY to be used which is
what we want.

> So I'll try that, and ad-hoc allocate descriptors needed
> above that range for drivers that are not yet allocating
> their descriptors ...
> 
> One question though: the real fix is obviously for all
> drivers exposing an irqchip to allocate its descriptors
> dynamically with exlicit alloc_descs() or using the
> linear irq domain instead of relying on pre-allocated
> descriptors.
> 
> Should we patch all drivers to spit out similar warnings
> then?

If you are bored with nothing else to do... Might as well fix them if
you can find them all.

Of course if you follow my previous suggestion, that would be a red flag
that you aren't fixing the irq_chip and we should reject the change. :)

Rob

> 
> Yours,
> Linus Walleij
>
diff mbox

Patch

diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index aa52699..fcda633 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -707,7 +707,7 @@  void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 	gic_irqs -= hwirq_base; /* calculate # of irqs to allocate */
 	irq_base = irq_alloc_descs(irq_start, 16, gic_irqs, numa_node_id());
 	if (IS_ERR_VALUE(irq_base)) {
-		WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
+		pr_debug("Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n",
 		     irq_start);
 		irq_base = irq_start;
 	}