From: sashiko-bot@kernel.org
To: "Chen-Yu Tsai" <wenst@chromium.org>
Cc: devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v5 03/16] power: sequencing: Add pwrseq_power_is_on()
Date: Wed, 15 Jul 2026 09:08:44 +0000 [thread overview]
Message-ID: <20260715090845.3E1561F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260715085348.3457359-4-wenst@chromium.org>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
New issues:
- [Medium] The !CONFIG_POWER_SEQUENCING stub for pwrseq_power_is_on() unconditionally returns -ENOSYS, breaking support for optional descriptors.
- [Medium] Unprotected lockless read of `desc->powered_on` in `pwrseq_power_is_on()` constitutes a data race.
Pre-existing issues:
- [High] The stubs for pwrseq_power_on() and pwrseq_power_off() unconditionally return -ENOSYS, breaking optional descriptors when CONFIG_POWER_SEQUENCING is disabled.
- [High] Lockless TOCTOU race on `desc->powered_on` in `pwrseq_power_on()` and `pwrseq_power_off()` allows concurrent calls to leak `enable_count` references.
--
--- Patch [3]: [PATCH v5 03/16] power: sequencing: Add pwrseq_power_is_on() ---
commit 32144de8b3a9da0a0745b35617cfc4d0359911df
Author: Chen-Yu Tsai <wenst@chromium.org>
power: sequencing: Add pwrseq_power_is_on()
This commit introduces pwrseq_power_is_on() to expose the internal power-on
state tracking to consumers, eliminating the need for local tracking. The API
handles optional descriptors by returning 1 if the descriptor is NULL.
> diff --git a/drivers/power/sequencing/core.c b/drivers/power/sequencing/core.c
> index 02f42da915985..db8c91be10c95 100644
> --- a/drivers/power/sequencing/core.c
> +++ b/drivers/power/sequencing/core.c
> @@ -968,6 +968,25 @@ int pwrseq_power_off(struct pwrseq_desc *desc)
> }
> EXPORT_SYMBOL_GPL(pwrseq_power_off);
[Severity: High]
This is a pre-existing issue, but could the lockless check of
desc->powered_on in pwrseq_power_on() and pwrseq_power_off() cause a race
condition that leaks enable_count references?
If two threads concurrently invoke pwrseq_power_on() with the same descriptor,
both could bypass the early check locklessly:
if (!desc || desc->powered_on)
return 0;
They then sequentially acquire pwrseq->state_lock, but neither re-validates
the flag inside the critical section. Both execute pwrseq_unit_enable(),
incrementing enable_count twice.
When pwrseq_power_off() is called later, the first invocation decrements the
count and clears desc->powered_on. The second invocation sees
desc->powered_on == false locklessly and returns early, leaving enable_count
permanently elevated.
> +/**
> + * pwrseq_power_is_on() - Queries the last requested state of the power sequencer.
> + * @desc: Descriptor referencing the power sequencer.
> + *
> + * This returns the last requested state of the power sequencer.
> + *
> + * Returns:
> + * On success, 1 for on or desc is NULL (optional) and 0 for off;
> + * negative error number on failure.
> + */
> +int pwrseq_power_is_on(struct pwrseq_desc *desc)
> +{
> + if (!desc)
> + return 1;
> +
> + return desc->powered_on;
[Severity: Medium]
Does this lockless read of desc->powered_on need READ_ONCE() to prevent data
races?
Since desc->powered_on can be concurrently modified by pwrseq_power_on()
and pwrseq_power_off(), reading it without protection might lead to unsafe
compiler optimizations.
> +}
> +EXPORT_SYMBOL_GPL(pwrseq_power_is_on);
[ ... ]
> diff --git a/include/linux/pwrseq/consumer.h b/include/linux/pwrseq/consumer.h
> index 3c907c9e1885d..3c6122bd02057 100644
> --- a/include/linux/pwrseq/consumer.h
> +++ b/include/linux/pwrseq/consumer.h
[ ... ]
> @@ -53,6 +54,11 @@ static inline int pwrseq_power_off(struct pwrseq_desc *desc)
> return -ENOSYS;
> }
[Severity: High]
This is a pre-existing issue, but do the stubs for pwrseq_power_on() and
pwrseq_power_off() also break optional descriptors?
If a driver invokes pwrseq_power_on(NULL) on a kernel without power
sequencing enabled, returning -ENOSYS instead of 0 defeats the purpose of
an optional descriptor, as consumers checking for errors will abort their
operations.
> +static inline int pwrseq_power_is_on(struct pwrseq_desc *desc)
> +{
> + return -ENOSYS;
> +}
[Severity: Medium]
When CONFIG_POWER_SEQUENCING is disabled, does this stub break the contract
for optional descriptors?
The commit message mentions returning 1 if the descriptor is NULL (optional),
but this stub unconditionally returns -ENOSYS. This will cause consumers
checking the power state of an optional descriptor to receive a negative
error code instead of the expected 1.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260715085348.3457359-1-wenst@chromium.org?part=3
next prev parent reply other threads:[~2026-07-15 9:08 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-15 8:53 [PATCH v5 00/16] arm64: mediatek: Add M.2 E-key slot on Chromebooks Chen-Yu Tsai
2026-07-15 8:53 ` [PATCH v5 01/16] device property: Add fwnode_graph_get_port_by_id() Chen-Yu Tsai
2026-07-15 9:03 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 02/16] device property: Add fwnode_graph_get_next_port_endpoint() Chen-Yu Tsai
2026-07-15 9:09 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 03/16] power: sequencing: Add pwrseq_power_is_on() Chen-Yu Tsai
2026-07-15 9:08 ` sashiko-bot [this message]
2026-07-15 9:29 ` Andy Shevchenko
2026-07-15 12:10 ` Bartosz Golaszewski
2026-07-15 8:53 ` [PATCH v5 04/16] usb: hub: Use assign_bit() in usb_hub_set_port_power() Chen-Yu Tsai
2026-07-15 9:11 ` Andy Shevchenko
2026-07-15 8:53 ` [PATCH v5 05/16] usb: hub: Return actual error from hub_configure() in hub_probe() Chen-Yu Tsai
2026-07-15 8:53 ` [PATCH v5 06/16] usb: hub: Associate port@ fwnode with USB port device Chen-Yu Tsai
2026-07-15 9:20 ` Andy Shevchenko
2026-07-15 8:53 ` [PATCH v5 07/16] usb: core: Move struct usb_port and related APIs to port.h Chen-Yu Tsai
2026-07-15 9:31 ` Andy Shevchenko
2026-07-15 8:53 ` [PATCH v5 08/16] usb: hub: Pass |struct usb_port*| to usb_port_is_power_on() Chen-Yu Tsai
2026-07-15 8:53 ` [PATCH v5 09/16] usb: hub: Use usb_hub_set_port_power() to control port power everywhere Chen-Yu Tsai
2026-07-15 8:53 ` [PATCH v5 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API Chen-Yu Tsai
2026-07-15 9:28 ` sashiko-bot
2026-07-15 13:25 ` Andy Shevchenko
2026-07-15 8:53 ` [PATCH v5 11/16] dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB connections Chen-Yu Tsai
2026-07-15 8:53 ` [PATCH v5 12/16] power: sequencing: pcie-m2: support matching on remote "port" node Chen-Yu Tsai
2026-07-15 9:29 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 13/16] power: sequencing: pcie-m2: Add usb and sdio targets for E-key connector Chen-Yu Tsai
2026-07-15 9:34 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 14/16] power: sequencing: pcie-m2: Split Bluetooth unit based on interface Chen-Yu Tsai
2026-07-15 9:34 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 15/16] arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot Chen-Yu Tsai
2026-07-15 9:45 ` sashiko-bot
2026-07-15 8:53 ` [PATCH v5 16/16] arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as " Chen-Yu Tsai
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=20260715090845.3E1561F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=wenst@chromium.org \
/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.