irqchip/loongson-eiointc: Skip handling if there is no pending interrupt
authorBibo Mao <maobibo@loongson.cn>
Tue, 30 Jan 2024 08:27:21 +0000 (16:27 +0800)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 13 Feb 2024 09:53:14 +0000 (10:53 +0100)
eiointc_irq_dispatch() iterates over the pending bit registers of the
interrupt controller and evaluates the result even if there is no interrupt
pending in a particular 64bit chunk.

Skip handling and especially the pointless write back for clearing the
non-pending bits if a chunk is empty.

[ tglx: Massaged changelog ]

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Huacai Chen <chenhuacai@loongson.cn>
Link: https://lore.kernel.org/r/20240130082722.2912576-3-maobibo@loongson.cn
drivers/irqchip/irq-loongson-eiointc.c

index 1623cd77917523f42419cb958ecbc0ce32ba8809..fad22e21e1c8834493caf98cbffb8067efb820f4 100644 (file)
@@ -198,6 +198,12 @@ static void eiointc_irq_dispatch(struct irq_desc *desc)
 
        for (i = 0; i < eiointc_priv[0]->vec_count / VEC_COUNT_PER_REG; i++) {
                pending = iocsr_read64(EIOINTC_REG_ISR + (i << 3));
+
+               /* Skip handling if pending bitmap is zero */
+               if (!pending)
+                       continue;
+
+               /* Clear the IRQs */
                iocsr_write64(pending, EIOINTC_REG_ISR + (i << 3));
                while (pending) {
                        int bit = __ffs(pending);