All of lore.kernel.org
 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 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.