From: sashiko-bot@kernel.org
To: "Mikhail Kshevetskiy" <mikhail.kshevetskiy@iopsys.eu>
Cc: conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org
Subject: Re: [PATCH v9 19/36] pinctrl: airoha: fix IRQ mask/unmask code
Date: Tue, 04 Aug 2026 16:32:43 +0000 [thread overview]
Message-ID: <20260804163243.805E41F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260804160419.3592327-20-mikhail.kshevetskiy@iopsys.eu>
Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
New issues:
- [High] gpiochip_disable_irq() and gpiochip_enable_irq() are incorrectly placed in .irq_mask and .irq_unmask, removing output protection during level-triggered IRQ handling.
Pre-existing issues:
- [High] The driver unconditionally uses handle_simple_irq for all interrupt types, leading to hard-IRQ storms for level-triggered interrupts.
- [High] Edge-triggered interrupts can be lost because the hardware status register is cleared after executing the child ISR.
- [High] regmap_update_bits/clear_bits is called within raw spinlock context without a raw spinlock-enabled regmap.
- [High] Use-After-Free and NULL pointer dereference of irqdomain due to incorrect devm registration order.
--
--- Patch [19]: [PATCH v9 19/36] pinctrl: airoha: fix IRQ mask/unmask code ---
commit a13f62731221613018aaaa7a5f563131118288c9
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Subject: pinctrl: airoha: fix IRQ mask/unmask code
This commit adds gpiochip_enable_irq() and gpiochip_disable_irq() calls
to airoha_irq_unmask() and airoha_irq_mask() respectively. This ensures
gpiolib tracks the interrupt enabled state and prevents
gpiod_direction_output() from mistakenly assuming the pin is not actively
used as an interrupt.
> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 261180b656392..42ae588e6343b 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
[ ... ]
> @@ -2629,6 +2630,7 @@ static void airoha_irq_mask(struct irq_data *data)
>
> regmap_clear_bits(pinctrl->regmap, gpiochip->level[index], mask);
> regmap_clear_bits(pinctrl->regmap, gpiochip->edge[index], mask);
[Severity: High]
This is a pre-existing issue, but does using regmap_clear_bits() here cause
lock nesting violations on real-time systems?
The interrupt core calls airoha_irq_mask() with a raw spinlock held. Because
pinctrl->regmap is a syscon regmap, it does not use raw spinlocks by default.
This means it becomes a sleeping lock on real-time kernels.
Acquiring a sleeping lock while holding a raw spinlock can lead to a panic.
> + gpiochip_disable_irq(gc, irqd_to_hwirq(data));
[Severity: High]
Does calling gpiochip_disable_irq() here remove output protection during
level-triggered interrupt handling?
When the irq core handles level-triggered interrupts, it temporarily masks
the interrupt by calling airoha_irq_mask() during handler execution. Since
gpiochip_disable_irq() is placed here, the GPIOD_FLAG_IRQ_IS_ENABLED bit is
cleared.
This would allow a concurrent call to gpiod_direction_output() to succeed
and mistakenly reconfigure the active interrupt pin as an output. Should
these calls be placed in dedicated .irq_enable and .irq_disable callbacks
instead?
> }
>
> static int airoha_irq_type(struct irq_data *data, unsigned int type)
[Severity: High]
This is a pre-existing issue, but does the driver fail to handle
level-triggered interrupts properly?
In airoha_pinctrl_add_gpiochip(), the handler is set to handle_simple_irq:
girq->handler = handle_simple_irq;
However, airoha_irq_type() doesn't call irq_set_handler_locked() to upgrade
the handler to handle_level_irq for level triggers. Since handle_simple_irq
does not mask the interrupt before executing a threaded handler, will the
unhandled hardware interrupt loop infinitely and cause an interrupt storm?
[Severity: High]
This is a pre-existing issue, but can edge-triggered interrupts be lost due
to the status clearing order?
In airoha_irq_handler(), the code clears the hardware status register after
executing the child interrupt handler:
generic_handle_irq(irq_find_mapping(girq->domain, offset));
regmap_write(pinctrl->regmap, pinctrl->gpiochip.status[i], BIT(irq));
If a new edge interrupt occurs for the same pin while the child handler is
running, the hardware latches the new edge. Will the subsequent
write-1-to-clear operation unconditionally clear the status bit and erase the
newly latched edge without it being processed?
[Severity: High]
This is a pre-existing issue, but is there a risk of a use-after-free or
null pointer dereference during teardown or early probe?
In airoha_pinctrl_add_gpiochip(), the shared interrupt is requested before
the gpiochip is added:
err = devm_request_irq(dev, irq, airoha_irq_handler, IRQF_SHARED,
dev_name(dev), pinctrl);
During driver removal, devm_gpiochip_add_data() unwinds first and destroys
the irq domain. The shared interrupt remains active until
devm_request_irq() unwinds.
If an interrupt fires during this window, airoha_irq_handler() will
dereference the freed girq->domain.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260804160419.3592327-1-mikhail.kshevetskiy@iopsys.eu?part=19
next prev parent reply other threads:[~2026-08-04 16:32 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 16:03 [PATCH v9 00/36] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 01/36] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 02/36] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 03/36] pinctrl: airoha: fix mdio bitfield names Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 04/36] pinctrl: airoha: an7581: fix pinconf of i2c_scl/i2c_sda pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 05/36] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 06/36] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-08-04 16:27 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 07/36] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 08/36] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 09/36] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 10/36] pinctrl: airoha: fix I2C1 pin mux config for AN7581 Mikhail Kshevetskiy
2026-08-04 16:28 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 11/36] pinctrl: airoha: fix I2C pin mux config for AN7583 Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 12/36] pinctrl: airoha: fix AN7583 MDIO pin mux config Mikhail Kshevetskiy
2026-08-04 16:28 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 13/36] pinctrl: airoha: an7583: fix spi group pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 14/36] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-08-04 16:26 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 15/36] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-08-04 16:26 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 16/36] pinctrl: airoha: minor improvements Mikhail Kshevetskiy
2026-08-04 16:23 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 17/36] pinctrl: airoha: fix getting gpiochip/pinctrl pointers in the IRQ handling code Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 18/36] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-08-04 16:24 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 19/36] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-08-04 16:32 ` sashiko-bot [this message]
2026-08-04 16:04 ` [PATCH v9 20/36] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-08-04 16:23 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 21/36] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 22/36] pinctrl: airoha: statically allocate gpio regs structure Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 23/36] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-08-04 16:38 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 25/36] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 26/36] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 27/36] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 28/36] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 29/36] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-08-04 16:29 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 30/36] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-08-04 16:38 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 31/36] dt-bindings: pinctrl: airoha: an7583: add missed features Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 32/36] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-08-04 16:44 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 33/36] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 34/36] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-08-04 16:34 ` sashiko-bot
2026-08-04 18:19 ` Rob Herring (Arm)
2026-08-04 16:04 ` [PATCH v9 35/36] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-08-04 16:35 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 36/36] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-08-04 16:33 ` sashiko-bot
2026-08-04 18:19 ` Rob Herring (Arm)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260804163243.805E41F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=mikhail.kshevetskiy@iopsys.eu \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.