Thread (30 messages) flat view 30 messages, 7 authors, 9h ago

Re: [PATCH v8 03/16] power: sequencing: Add pwrseq_get_state()

From: sashiko-bot@kernel.org
Date: 2026-09-04 08:57:02

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

New issues:
- [Low] Data race when reading desc->powered_on locklessly in pwrseq_get_state()

Pre-existing issues:
- [High] TOCTOU race in pwrseq_enable() and pwrseq_disable() causes permanent resource leak or WARN()
--

commit 5b89b7211c4aa2df354664ebde1b55a332d08712
Author: Chen-Yu Tsai [off-list ref]
Date:   Fri Sep 4 08:41:42 2026 +0000

    power: sequencing: Add pwrseq_get_state()
    
    The power sequencing consumer API already does power on state tracking
    internally. Expose the state to consumers through pwrseq_get_state()
    so that they don't have to reimplement it locally.
quoted hunk ↗ jump to hunk
diff --git a/drivers/power/sequencing/core.c b/drivers/power/sequencing/core.c
index 721e888b658d1..dbb2bd2f8864e 100644
--- a/drivers/power/sequencing/core.c
+++ b/drivers/power/sequencing/core.c
@@ -968,6 +968,25 @@ int pwrseq_disable(struct pwrseq_desc *desc)
[Severity: High]
This is a pre-existing issue, but could the lockless checks of desc->powered_on
lead to a resource leak or a WARN() due to a TOCTOU race?

If a consumer calls pwrseq_enable() from two threads concurrently, could they
both bypass the lockless check:

drivers/power/sequencing/core.c:pwrseq_enable() {
    ...
    if (!desc || desc->powered_on)
        return 0;
    ...
}

and then both acquire state_lock and double-increment the provider unit's
enable_count?

A subsequent single pwrseq_disable() would then clear desc->powered_on:

drivers/power/sequencing/core.c:pwrseq_disable() {
    ...
    if (!desc || !desc->powered_on)
        return 0;
    ...
}

causing future disables to return early locklessly. Would this leave the
unit's enable_count permanently elevated?

Additionally, if pwrseq_disable() races with the lockless post_enable() error
rollback path, could it trigger the WARN(1) in pwrseq_unit_disable() due to
underflowing enable_count?
 }
 EXPORT_SYMBOL_GPL(pwrseq_disable);
 
+/**
+ * pwrseq_get_state() - Queries the last requested state of the power sequencer.
[ ... ]
+int pwrseq_get_state(struct pwrseq_desc *desc)
+{
+	if (!desc)
+		return -EINVAL;
+
+	return desc->powered_on ? PWRSEQ_STATE_ON : PWRSEQ_STATE_OFF;
[Severity: Low]
Does this lockless read of a state variable that is concurrently modified by
writers without READ_ONCE() cause a data race?

Since pwrseq_get_state() can be called concurrently with pwrseq_enable() or
pwrseq_disable(), kernel concurrency rules generally require READ_ONCE() for
lockless reads of shared variables to prevent compiler optimization issues.
+}
+EXPORT_SYMBOL_GPL(pwrseq_get_state);
-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260904084158.1341550-1-wenst@chromium.org?part=3
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help