Message ID | 1420695752-924-1-git-send-email-gwshan@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Michael Ellerman |
Headers | show |
On Thu, 2015-08-01 at 05:42:32 UTC, Gavin Shan wrote: > On PowerNV platform, the OPAL interrupts are exported by firmware > through device-node property (/ibm,opal::opal-interrupts). Under > some extreme circumstances (e.g. simulator), we don't have this > property found from the device tree. For that case, we shouldn't > allocate the interrupt map. Otherwise, slab complains allocating > zero sized memory chunk. That sounds fine. But the implementation is a bit messy. Can you do a precursor patch which moves the logic into opal_irq_init(), that way when you find no interrupts you can just return. cheers
On Thu, Jan 22, 2015 at 04:54:59PM +1100, Michael Ellerman wrote: >On Thu, 2015-08-01 at 05:42:32 UTC, Gavin Shan wrote: >> On PowerNV platform, the OPAL interrupts are exported by firmware >> through device-node property (/ibm,opal::opal-interrupts). Under >> some extreme circumstances (e.g. simulator), we don't have this >> property found from the device tree. For that case, we shouldn't >> allocate the interrupt map. Otherwise, slab complains allocating >> zero sized memory chunk. > >That sounds fine. But the implementation is a bit messy. > >Can you do a precursor patch which moves the logic into opal_irq_init(), that >way when you find no interrupts you can just return. > Sure, I'll change the code accordingly and repost. Thanks, Gavin >cheers >
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index f10b9ec..e61cefe 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -726,11 +726,14 @@ static int __init opal_init(void) /* Find all OPAL interrupts and request them */ irqs = of_get_property(opal_node, "opal-interrupts", &irqlen); + opal_irq_count = irqs ? (irqlen / 4) : 0; + if (opal_irq_count) + opal_irqs = kzalloc(opal_irq_count * sizeof(unsigned int), + GFP_KERNEL); pr_debug("opal: Found %d interrupts reserved for OPAL\n", - irqs ? (irqlen / 4) : 0); - opal_irq_count = irqlen / 4; - opal_irqs = kzalloc(opal_irq_count * sizeof(unsigned int), GFP_KERNEL); - for (i = 0; irqs && i < (irqlen / 4); i++, irqs++) { + opal_irq_count); + + for (i = 0; opal_irqs && i < opal_irq_count; i++, irqs++) { unsigned int hwirq = be32_to_cpup(irqs); unsigned int irq = irq_create_mapping(NULL, hwirq); if (irq == NO_IRQ) { @@ -775,7 +778,7 @@ void opal_shutdown(void) long rc = OPAL_BUSY; /* First free interrupts, which will also mask them */ - for (i = 0; i < opal_irq_count; i++) { + for (i = 0; opal_irqs && i < opal_irq_count; i++) { if (opal_irqs[i]) free_irq(opal_irqs[i], NULL); opal_irqs[i] = 0;
On PowerNV platform, the OPAL interrupts are exported by firmware through device-node property (/ibm,opal::opal-interrupts). Under some extreme circumstances (e.g. simulator), we don't have this property found from the device tree. For that case, we shouldn't allocate the interrupt map. Otherwise, slab complains allocating zero sized memory chunk. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> --- arch/powerpc/platforms/powernv/opal.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)