devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Mikhail Kshevetskiy" <mikhail.kshevetskiy@iopsys.eu>
Cc: devicetree@vger.kernel.org, conor+dt@kernel.org, robh@kernel.org
Subject: Re: [PATCH v10 22/36] pinctrl: airoha: statically allocate gpio regs structure
Date: Wed, 05 Aug 2026 12:59:23 +0000	[thread overview]
Message-ID: <20260805125923.C10A41F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260805123408.3767648-23-mikhail.kshevetskiy@iopsys.eu>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [Low] The statically allocated `airoha_gpiochip_regs` structure is not marked as `const`.

Pre-existing issues:
- [High] Redundant clearing of the interrupt status bit in `airoha_irq_handler` creates a race condition for edge-triggered interrupts, potentially causing them to be lost.
- [High] Interrupt handler is requested before the gpiochip is fully initialized, creating a window for a Use-After-Free of the irqdomain during device teardown.
--

--- Patch [22]: [PATCH v10 22/36] pinctrl: airoha: statically allocate gpio regs structure ---
commit 9c7301e7610a12f2a7f33d437ec5e58ef02929f3
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>

pinctrl: airoha: statically allocate gpio regs structure

This commit refactors the Airoha pinctrl driver to collect all GPIO register
arrays into a single statically allocated structure. The driver is updated
to reference this new structure via a pointer, simplifying the gpiochip setup.

> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 8e418f27fd8bc..e8d5252b17f30 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
> @@ -339,6 +350,15 @@ static const u32 irq_edge_regs[] = {
>  	REG_GPIO_INT_EDGE3
>  };
>  
> +static struct airoha_gpiochip_regs airoha_gpiochip_regs = {

[Severity: Low]
Could this structure be marked as const? It appears to only serve as a
read-only lookup table of pointer arrays, so marking it const would move
it to the read-only .rodata section.

> +	.data = gpio_data_regs,
> +	.dir = gpio_dir_regs,
> +	.out = gpio_out_regs,
> +	.status = irq_status_regs,
> +	.level = irq_level_regs,
> +	.edge = irq_edge_regs,
> +};
> +
[ ... ]
> @@ -2698,7 +2708,7 @@ static irqreturn_t airoha_irq_handler(int irq, void *data)
>  
>  			generic_handle_domain_irq(girq->domain, offset);
>  			regmap_write(pinctrl->regmap,
> -				     pinctrl->gpiochip.status[i], BIT(irq));

[Severity: High]
This is a pre-existing issue, but does this regmap_write() to clear the status
bit create a race condition for edge-triggered interrupts?

The core IRQ subsystem already clears the hardware interrupt status bit before
invoking the flow handler via airoha_irq_ack(). If a new edge-triggered
interrupt arrives on the same pin while generic_handle_domain_irq() is
executing, the hardware will latch the new event.

Would clearing the status bit a second time here wipe out the newly latched
interrupt before it can be processed?

> +				     pinctrl->gpio_regs->status[i], BIT(irq));
>  		}
>  		handled |= !!status;
>  	}
> @@ -2719,8 +2729,7 @@ static const struct irq_chip airoha_gpio_irq_chip = {
>  static int airoha_pinctrl_add_gpiochip(struct airoha_pinctrl *pinctrl,
>  					struct platform_device *pdev)
>  {
> -	struct airoha_pinctrl_gpiochip *chip = &pinctrl->gpiochip;
> -	struct gpio_chip *gc = &chip->chip;
> +	struct gpio_chip *gc = &pinctrl->gpiochip;

[Severity: High]
This isn't a bug introduced by this patch, but is there a use-after-free
risk during device teardown based on the initialization order in this function?

Further down in airoha_pinctrl_add_gpiochip(), devm_request_irq() is called
before devm_gpiochip_add_data():

	err = devm_request_irq(dev, irq, airoha_irq_handler, IRQF_SHARED,
				dev_name(dev), pinctrl);
	if (err) {
		dev_err(dev, "error requesting irq %d: %d\n", irq, err);
		return err;
	}

	return devm_gpiochip_add_data(dev, gc, pinctrl);

Since devres cleans up in reverse order, devm_gpiochip_add_data() will be
undone first, destroying the irq domain while the shared interrupt handler
remains active. If a shared interrupt fires during this window,
airoha_irq_handler() will pass a freed girq->domain to
generic_handle_domain_irq().

Should devm_request_irq() be called after devm_gpiochip_add_data() to ensure
safe teardown?

>  	struct gpio_irq_chip *girq = &gc->irq;
>  	struct device *dev = &pdev->dev;
>  	int irq, err;

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260805123408.3767648-1-mikhail.kshevetskiy@iopsys.eu?part=22

  reply	other threads:[~2026-08-05 12:59 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05 12:33 [PATCH v10 00/36] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 01/36] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 02/36] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-08-06  7:07   ` Krzysztof Kozlowski
2026-08-05 12:33 ` [PATCH v10 03/36] pinctrl: airoha: fix mdio bitfield names Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 04/36] pinctrl: airoha: an7581: fix pinconf of i2c_scl/i2c_sda pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 05/36] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 06/36] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 07/36] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 08/36] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 09/36] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-08-06  7:09   ` Krzysztof Kozlowski
2026-08-05 12:33 ` [PATCH v10 10/36] pinctrl: airoha: fix I2C1 pin mux config for AN7581 Mikhail Kshevetskiy
2026-08-05 12:49   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 11/36] pinctrl: airoha: fix I2C pin mux config for AN7583 Mikhail Kshevetskiy
2026-08-05 12:57   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 12/36] pinctrl: airoha: fix AN7583 MDIO pin mux config Mikhail Kshevetskiy
2026-08-05 12:44   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 13/36] pinctrl: airoha: an7583: fix spi group pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 14/36] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-08-05 12:52   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 15/36] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-08-05 12:56   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 16/36] pinctrl: airoha: minor improvements Mikhail Kshevetskiy
2026-08-05 12:56   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 17/36] pinctrl: airoha: fix getting gpiochip/pinctrl pointers in the IRQ handling code Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 18/36] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 19/36] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 20/36] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-08-05 12:54   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 21/36] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-08-05 12:57   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 22/36] pinctrl: airoha: statically allocate gpio regs structure Mikhail Kshevetskiy
2026-08-05 12:59   ` sashiko-bot [this message]
2026-08-05 12:33 ` [PATCH v10 23/36] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-08-05 12:58   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 25/36] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 26/36] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 27/36] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-08-05 12:34 ` [PATCH v10 28/36] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 29/36] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 30/36] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 31/36] dt-bindings: pinctrl: airoha: an7583: add missed features Mikhail Kshevetskiy
2026-08-06  7:12   ` Krzysztof Kozlowski
2026-08-05 12:34 ` [PATCH v10 32/36] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-08-05 13:08   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 33/36] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 34/36] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 35/36] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-08-05 13:11   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 36/36] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot

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=20260805125923.C10A41F000E9@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).