]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: sleep: core: Avoid bit field races related to work_in_progress
authorXuewen Yan <xuewen.yan@unisoc.com>
Wed, 4 Feb 2026 12:25:09 +0000 (13:25 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 4 Feb 2026 12:25:09 +0000 (13:25 +0100)
In all of the system suspend transition phases, the async processing of
a device may be carried out in parallel with power.work_in_progress
updates for the device's parent or suppliers and if it touches bit
fields from the same group (for example, power.must_resume or
power.wakeup_path), bit field corruption is possible.

To avoid that, turn work_in_progress in struct dev_pm_info into a proper
bool field and relocate it to save space.

Fixes: aa7a9275ab81 ("PM: sleep: Suspend async parents after suspending children")
Fixes: 443046d1ad66 ("PM: sleep: Make suspend of devices more asynchronous")
Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
Closes: https://lore.kernel.org/linux-pm/20260203063459.12808-1-xuewen.yan@unisoc.com/
Cc: All applicable <stable@vger.kernel.org>
[ rjw: Added subject and changelog ]
Link: https://patch.msgid.link/CAB8ipk_VX2VPm706Jwa1=8NSA7_btWL2ieXmBgHr2JcULEP76g@mail.gmail.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
include/linux/pm.h

index 98a899858eceee634e6e4e0c513d2a50e9aba940..afcaaa37a8126669c7f646d0c5c3f64c150aab47 100644 (file)
@@ -681,10 +681,10 @@ struct dev_pm_info {
        struct list_head        entry;
        struct completion       completion;
        struct wakeup_source    *wakeup;
+       bool                    work_in_progress;       /* Owned by the PM core */
        bool                    wakeup_path:1;
        bool                    syscore:1;
        bool                    no_pm_callbacks:1;      /* Owned by the PM core */
-       bool                    work_in_progress:1;     /* Owned by the PM core */
        bool                    smart_suspend:1;        /* Owned by the PM core */
        bool                    must_resume:1;          /* Owned by the PM core */
        bool                    may_skip_resume:1;      /* Set by subsystems */