Felipe, * Tony Lindgren <tony@xxxxxxxxxxx> [150119 13:41]: > * Felipe Balbi <balbi@xxxxxx> [150102 10:50]: > > as it turns out the current IRQ number will > > *always* be available from SIR register which > > renders the reads of PENDING registers as plain > > unnecessary overhead. > > > > In order to catch any situation where SIR reads > > as zero, we're adding a WARN() to turn it into > > a very verbose error and users actually report > > it. > > > > With this patch average running time of > > omap_intc_handle_irq() reduced from about 28.5us > > to 19.8us as measured by the kernel function > > profiler. > > > > Tested with BeagleBoneBlack Rev A5C. > > > > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > > Jason, looks like this is not showing up in Linux next. The > same for the changes I did for dm81xx. Can you please resend this to Jason? Looks like this is still not merged. Regards, Tony > > Before applying, it would be very nice to get reports > > from other folks on different platforms, specially OMAP2/3 > > ones which I don't have (easy) access. > > > > drivers/irqchip/irq-omap-intc.c | 35 +++++------------------------------ > > 1 file changed, 5 insertions(+), 30 deletions(-) > > > > diff --git a/drivers/irqchip/irq-omap-intc.c b/drivers/irqchip/irq-omap-intc.c > > index 28718d3..a2da6d5 100644 > > --- a/drivers/irqchip/irq-omap-intc.c > > +++ b/drivers/irqchip/irq-omap-intc.c > > @@ -315,37 +315,12 @@ static int __init omap_init_irq(u32 base, struct device_node *node) > > static asmlinkage void __exception_irq_entry > > omap_intc_handle_irq(struct pt_regs *regs) > > { > > - u32 irqnr = 0; > > - int handled_irq = 0; > > - int i; > > - > > - do { > > - for (i = 0; i < omap_nr_pending; i++) { > > - irqnr = intc_readl(INTC_PENDING_IRQ0 + (0x20 * i)); > > - if (irqnr) > > - goto out; > > - } > > - > > -out: > > - if (!irqnr) > > - break; > > - > > - irqnr = intc_readl(INTC_SIR); > > - irqnr &= ACTIVEIRQ_MASK; > > + u32 irqnr; > > > > - if (irqnr) { > > - handle_domain_irq(domain, irqnr, regs); > > - handled_irq = 1; > > - } > > - } while (irqnr); > > - > > - /* > > - * If an irq is masked or deasserted while active, we will > > - * keep ending up here with no irq handled. So remove it from > > - * the INTC with an ack. > > - */ > > - if (!handled_irq) > > - omap_ack_irq(NULL); > > + irqnr = intc_readl(INTC_SIR); > > + irqnr &= ACTIVEIRQ_MASK; > > + WARN(!irqnr, "Spuriour IRQ ?\n"); > > + handle_domain_irq(domain, irqnr, regs); > > } > > > > void __init omap2_init_irq(void) > > -- > > 2.2.0 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html