lkml.org 
[lkml]   [2021]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 164/323] irq: mips: avoid nested irq_enter()
    Date
    From: Mark Rutland <mark.rutland@arm.com>

    [ Upstream commit c65b52d02f6c1a06ddb20cba175ad49eccd6410d ]

    As bcm6345_l1_irq_handle() is a chained irqchip handler, it will be
    invoked within the context of the root irqchip handler, which must have
    entered IRQ context already.

    When bcm6345_l1_irq_handle() calls arch/mips's do_IRQ() , this will nest
    another call to irq_enter(), and the resulting nested increment to
    `rcu_data.dynticks_nmi_nesting` will cause rcu_is_cpu_rrupt_from_idle()
    to fail to identify wakeups from idle, resulting in failure to preempt,
    and RCU stalls.

    Chained irqchip handlers must invoke IRQ handlers by way of thee core
    irqchip code, i.e. generic_handle_irq() or generic_handle_domain_irq()
    and should not call do_IRQ(), which is intended only for root irqchip
    handlers.

    Fix bcm6345_l1_irq_handle() by calling generic_handle_irq() directly.

    Fixes: c7c42ec2baa1de7a ("irqchips/bmips: Add bcm6345-l1 interrupt controller")
    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/irqchip/irq-bcm6345-l1.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/drivers/irqchip/irq-bcm6345-l1.c b/drivers/irqchip/irq-bcm6345-l1.c
    index 43f8abe40878a..31ea6332ecb83 100644
    --- a/drivers/irqchip/irq-bcm6345-l1.c
    +++ b/drivers/irqchip/irq-bcm6345-l1.c
    @@ -143,7 +143,7 @@ static void bcm6345_l1_irq_handle(struct irq_desc *desc)
    for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) {
    irq = irq_linear_revmap(intc->domain, base + hwirq);
    if (irq)
    - do_IRQ(irq);
    + generic_handle_irq(irq);
    else
    spurious_interrupt();
    }
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-24 14:03    [W:4.302 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site