From: sashiko-bot@kernel.org
To: "Rosen Penev" <rosenp@gmail.com>
Cc: linux-rt-devel@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCHv2] gpio: mvebu: keep resume masks within the irqchip cache
Date: Tue, 15 Sep 2026 00:57:30 +0000 [thread overview]
Message-ID: <20260915005731.023A61F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260915004406.115230-1-rosenp@gmail.com>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] gpio: mvebu: TOCTOU race in resume causes interrupt storm
--
commit 6b10f9bb173190e25a679e67f7992002ca12fe2f
Author: Rosen Penev <rosenp@gmail.com>
gpio: mvebu: keep resume masks within the irqchip cache
This commit fixes a resume hang in mvebu_gpio_resume by masking restored
values with the matching irqchip mask cache. It reads the caches under
gc->lock to keep them consistent with mask/unmask handlers.
> diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
> index 93b8a08b04b9f..a2796240fe14b 100644
> --- a/drivers/gpio/gpio-mvebu.c
> +++ b/drivers/gpio/gpio-mvebu.c
[ ... ]
> @@ -1045,32 +1047,51 @@ static int mvebu_gpio_resume(struct platform_device *pdev)
> regmap_write(mvchip->regs, GPIO_IN_POL_OFF + mvchip->offset,
> mvchip->in_pol_reg);
>
> + /*
> + * genirq skips mask_irq() for a line it already considers masked, so
> + * unmasking one behind its back leaves an asserted level line that
> + * nobody masks. Restore only bits the irqchip cache still has set.
> + *
> + * Snapshot the caches under the raw spinlock, but release it before
> + * the regmap writes below: regmap_write() takes a sleepable lock on
> + * PREEMPT_RT.
> + */
> + if (mvchip->domain) {
> + struct irq_chip_generic *gc;
> +
> + gc = irq_get_domain_generic_chip(mvchip->domain, 0);
> + raw_spin_lock_irqsave(&gc->lock, flags);
> + level_cache = gc->chip_types[0].mask_cache_priv;
> + edge_cache = gc->chip_types[1].mask_cache_priv;
> + raw_spin_unlock_irqrestore(&gc->lock, flags);
[Severity: High]
Does releasing the lock here create a race window?
If a level-triggered interrupt fires immediately after the lock is released,
the IRQ handler runs. Genirq would acquire the lock, mask the hardware, and
clear the bit in mask_cache_priv.
> + }
> +
> switch (mvchip->soc_variant) {
> case MVEBU_GPIO_SOC_VARIANT_ORION:
> case MVEBU_GPIO_SOC_VARIANT_A8K:
> regmap_write(mvchip->regs, GPIO_EDGE_MASK_OFF + mvchip->offset,
> - mvchip->edge_mask_regs[0]);
> + mvchip->edge_mask_regs[0] & edge_cache);
[Severity: High]
Could writing the stale snapshot here unmask an IRQ that genirq just masked?
If the race described above occurs, mvebu_gpio_resume() continues and writes
its stale snapshot (with the bit set) to the hardware mask register. This
would unmask the line in hardware while genirq's irq_data maintains the
IRQD_IRQ_MASKED flag.
When the interrupt inevitably fires again, could genirq skip masking it
because it is already marked masked, leading to an unhandled infinite
interrupt storm and kernel lockup?
[Severity: High]
This is a pre-existing issue, but does the bitwise AND permanently drop IRQs
that were unmasked during early resume?
If a driver disables an IRQ before suspend, the snapshot bit in
edge_mask_regs is 0. If the driver then calls enable_irq() during an early
resume phase (like .resume_noirq), genirq correctly unmasks the hardware and
sets the cache bit to 1.
When mvebu_gpio_resume() later executes in the .resume phase, it calculates
0 (snapshot) & 1 (cache) = 0 and writes 0 to the hardware. Does this leave
the hardware permanently masked while genirq considers it unmasked, silently
breaking the interrupt?
> regmap_write(mvchip->regs, GPIO_LEVEL_MASK_OFF + mvchip->offset,
> - mvchip->level_mask_regs[0]);
> + mvchip->level_mask_regs[0] & level_cache);
> break;
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260915004406.115230-1-rosenp@gmail.com?part=1
next prev parent reply other threads:[~2026-09-15 0:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 0:44 [PATCHv2] gpio: mvebu: keep resume masks within the irqchip cache Rosen Penev
2026-09-15 0:57 ` sashiko-bot [this message]
2026-09-15 6:43 ` Sebastian Andrzej Siewior
2026-09-15 22:24 ` Rosen Penev
2026-09-16 6:55 ` Sebastian Andrzej Siewior
2026-09-17 9:52 ` Bartosz Golaszewski
2026-09-17 10:04 ` Sebastian Andrzej Siewior
2026-09-17 23:14 ` Rosen Penev
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=20260915005731.023A61F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=rosenp@gmail.com \
--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.