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 v7 14/34] pinctrl: airoha: fix potential kenel panic in IRQ handling code
Date: Mon, 27 Jul 2026 07:55:16 +0000	[thread overview]
Message-ID: <20260727075516.F0E091F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260727074234.3761170-15-mikhail.kshevetskiy@iopsys.eu>

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

Pre-existing issues:
- [High] The shared parent IRQ is requested before the gpiochip and its IRQ domain are fully initialized, creating race conditions that lead to NULL pointer dereferences on probe and Use-After-Free during teardown.
- [High] The driver hardcodes `handle_simple_irq` for all interrupts and manually ACKs status bits after handling, causing race conditions that permanently lose edge interrupts.
- [High] The irq_chip callbacks call regmap functions on a syscon regmap, attempting to acquire a sleepable spinlock while holding a raw spinlock.
--

--- Patch [14]: [PATCH v7 14/34] pinctrl: airoha: fix potential kenel panic in IRQ handling code ---
commit 4e32db00b413a54d784b7251323863762cc5e739
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>

    pinctrl: airoha: fix potential kenel panic in IRQ handling code
    
    This commit fixes invalid pointer initializations for gpiochip and pinctrl
    variables in the irq callback functions. Previously, these pointers were
    derived incorrectly, leading to dangerous memory accesses. The patch updates
    the code to correctly obtain the required pointers.

> pinctrl: airoha: fix potential kenel panic in IRQ handling code

This isn't a bug, but there's a typo (kenel) in the subject line.

[ ... ]

> So any access to the data pointed by gpiochip and pinctrl variables is
> extremelly dangerous.

This isn't a bug, but there's a typo (extremelly) here.

> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index fcf498f7720c9..6b881ab56d9c3 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
> @@ -2606,14 +2605,12 @@ static void airoha_irq_unmask(struct irq_data *data)
>  
>  static void airoha_irq_mask(struct irq_data *data)
>  {
> +	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
> +	struct airoha_pinctrl *pinctrl = gpiochip_get_data(gc);
> +	struct airoha_pinctrl_gpiochip *gpiochip = &pinctrl->gpiochip;
>  	u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_PIN;
>  	u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_PIN;
>  	u32 mask = GENMASK(2 * offset + 1, 2 * offset);
>  
>  	regmap_clear_bits(pinctrl->regmap, gpiochip->level[index], mask);

[Severity: High]
This is a pre-existing issue, but on real-time kernels, wouldn't this result
in a scheduling while atomic bug?

The airoha_irq_mask() and airoha_irq_unmask() callbacks execute in atomic
hardirq context holding a raw_spinlock_t. However, they call
regmap_clear_bits() and regmap_update_bits() which attempt to acquire the
syscon regmap's lock.

Since the regmap from airoha_pinctrl_probe() uses a standard spinlock_t
(which becomes a sleepable rt_mutex on real-time kernels), could acquiring it
here trigger an invalid locking sequence?

[ ... ]

While reviewing this, I noticed a couple of other pre-existing regressions
in the driver's interrupt handling code:

[Severity: High]
This isn't a bug introduced by this patch, but does the devres cleanup order
create a use-after-free or null pointer dereference risk?

In airoha_pinctrl_add_gpiochip(), the parent interrupt is requested before the
gpiochip is added:

	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);

Due to devres ordering (first-in, last-out), the domain will be destroyed
before the parent interrupt is freed during device unbind or if a later probe
step fails.

If an interrupt fires during this teardown window, wouldn't
airoha_irq_handler() dereference the freed girq->domain pointer here?

			generic_handle_irq(irq_find_mapping(girq->domain,
							    offset));

Could the request be moved after the gpiochip is added to ensure safe
teardown?

[Severity: High]
This is a pre-existing issue, but could this logic permanently lose concurrent
edge events?

In airoha_pinctrl_add_gpiochip(), the driver hardcodes handle_simple_irq for
all interrupts, regardless of their type:

	girq->handler = handle_simple_irq;
	gpio_irq_chip_set_chip(girq, &airoha_gpio_irq_chip);

And in airoha_irq_handler(), the hardware status bit is manually cleared
after handling the event:

			generic_handle_irq(irq_find_mapping(girq->domain,
							    offset));
			regmap_write(pinctrl->regmap,
				     pinctrl->gpiochip.status[i], BIT(irq));

If a second edge event arrives while the child handler is executing, wouldn't
the manual regmap_write unconditionally clear the status bit and cause the
new edge event to be discarded?

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

  reply	other threads:[~2026-07-27  7:55 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-27  7:42 [PATCH v7 00/34] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 01/34] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-07-27  7:46   ` Lorenzo Bianconi
2026-07-27  7:50   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 02/34] dt-bindings: pinctrl: airoha: en7581: fix pwm pin-groups Mikhail Kshevetskiy
2026-07-27  7:47   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 03/34] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 04/34] pinctrl: airoha: an7581: fix misprint in bitfield name Mikhail Kshevetskiy
2026-07-27  7:50   ` Lorenzo Bianconi
2026-07-27  7:52   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 05/34] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-07-27  7:54   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 06/34] pinctrl: airoha: an7583: there are no muxes to enable i2c buses Mikhail Kshevetskiy
2026-07-27  7:53   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 07/34] dt-bindings: pinctrl: airoha: an7583: remove i2c pin function Mikhail Kshevetskiy
2026-07-27  7:51   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 08/34] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-07-27  7:55   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 09/34] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 10/34] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 11/34] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 12/34] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-07-27  7:57   ` sashiko-bot
2026-07-27  8:04   ` Lorenzo Bianconi
2026-07-27  9:40     ` Mikhail Kshevetskiy
2026-07-27  9:46       ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 13/34] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-07-27  7:58   ` sashiko-bot
2026-07-27  8:06   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 14/34] pinctrl: airoha: fix potential kenel panic in IRQ handling code Mikhail Kshevetskiy
2026-07-27  7:55   ` sashiko-bot [this message]
2026-07-27  8:31   ` Lorenzo Bianconi
2026-07-27  9:02     ` Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 15/34] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-07-27  7:59   ` sashiko-bot
2026-07-27  8:37   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 16/34] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-07-27  8:02   ` sashiko-bot
2026-07-27  8:34   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 17/34] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-07-27  7:59   ` sashiko-bot
2026-07-27  9:01   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 18/34] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-07-27  8:00   ` sashiko-bot
2026-07-27  9:03   ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 19/34] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-07-27  8:04   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 20/34] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-07-27  8:19   ` sashiko-bot
2026-07-27  9:14   ` Lorenzo Bianconi
2026-07-27  9:23     ` Mikhail Kshevetskiy
2026-07-27  9:27       ` Lorenzo Bianconi
2026-07-27  9:28         ` Mikhail Kshevetskiy
2026-07-27 12:48           ` Lorenzo Bianconi
2026-07-27  7:42 ` [PATCH v7 21/34] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 22/34] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 23/34] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 24/34] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-07-27  8:01   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 25/34] dt-bindings: pinctrl: airoha: an7583: add npu_uart pin group Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 26/34] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-07-27  8:05   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 27/34] dt-bindings: pinctrl: airoha: an7583: add pon_alt pin group Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 28/34] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 29/34] dt-bindings: pinctrl: airoha: an7583: add olt function/group Mikhail Kshevetskiy
2026-07-27  7:42 ` [PATCH v7 30/34] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-07-27  8:13   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 31/34] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-07-27  8:06   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 32/34] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-07-27  8:06   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 33/34] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-07-27  8:07   ` sashiko-bot
2026-07-27  7:42 ` [PATCH v7 34/34] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-07-27  8:10   ` 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=20260727075516.F0E091F000E9@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.