lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 425/717] gpiolib: irq hooks: fix recursion in gpiochip_irq_unmask
    Date
    From: Nikita Shubin <nikita.shubin@maquefel.me>

    [ Upstream commit 9d5522199505c761575c8ea31dcfd9a2a8d73614 ]

    irqchip shared with multiple gpiochips, leads to recursive call of
    gpiochip_irq_mask/gpiochip_irq_unmask which was assigned to
    rqchip->irq_mask/irqchip->irq_unmask, these happens becouse of
    only irqchip->irq_enable == gpiochip_irq_enable is checked.

    Let's add an additional check to make sure shared irqchip is detected
    even if irqchip->irq_enable wasn't defined.

    Fixes: a8173820f441 ("gpio: gpiolib: Allow GPIO IRQs to lazy disable")
    Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
    Link: https://lore.kernel.org/r/20201210070514.13238-1-nikita.shubin@maquefel.me
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpio/gpiolib.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
    index 6e3c4d7a7d146..4ad3c4b276dcf 100644
    --- a/drivers/gpio/gpiolib.c
    +++ b/drivers/gpio/gpiolib.c
    @@ -1477,7 +1477,8 @@ static void gpiochip_set_irq_hooks(struct gpio_chip *gc)
    if (WARN_ON(gc->irq.irq_enable))
    return;
    /* Check if the irqchip already has this hook... */
    - if (irqchip->irq_enable == gpiochip_irq_enable) {
    + if (irqchip->irq_enable == gpiochip_irq_enable ||
    + irqchip->irq_mask == gpiochip_irq_mask) {
    /*
    * ...and if so, give a gentle warning that this is bad
    * practice.
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:22    [W:4.020 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site