]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: runtime: Do not clear needs_force_resume with enabled runtime PM
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 15 Dec 2025 14:21:34 +0000 (15:21 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 16 Dec 2025 11:58:57 +0000 (12:58 +0100)
Commit 89d9cec3b1e9 ("PM: runtime: Clear power.needs_force_resume in
pm_runtime_reinit()") added provisional clearing of power.needs_force_resume
to pm_runtime_reinit(), but it is done unconditionally which is a
mistake because pm_runtime_reinit() may race with driver probing
and removal [1].

To address this, notice that power.needs_force_resume should never
be set when runtime PM is enabled and so it only needs to be cleared
when runtime PM is disabled, and update pm_runtime_init() to only
clear that flag when runtime PM is disabled.

Fixes: 89d9cec3b1e9 ("PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit()")
Reported-by: Ed Tsai <ed.tsai@mediatek.com>
Closes: https://lore.kernel.org/linux-pm/20251215122154.3180001-1-ed.tsai@mediatek.com/ [1]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: 6.17+ <stable@vger.kernel.org> # 6.17+
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Link: https://patch.msgid.link/12807571.O9o76ZdvQC@rafael.j.wysocki
drivers/base/power/runtime.c

index 84676cc2422147731209971225e093cbaadbe3e8..0ee8ea971aa4684bb508e160abab78a91b82f590 100644 (file)
@@ -1868,16 +1868,18 @@ void pm_runtime_init(struct device *dev)
  */
 void pm_runtime_reinit(struct device *dev)
 {
-       if (!pm_runtime_enabled(dev)) {
-               if (dev->power.runtime_status == RPM_ACTIVE)
-                       pm_runtime_set_suspended(dev);
-               if (dev->power.irq_safe) {
-                       spin_lock_irq(&dev->power.lock);
-                       dev->power.irq_safe = 0;
-                       spin_unlock_irq(&dev->power.lock);
-                       if (dev->parent)
-                               pm_runtime_put(dev->parent);
-               }
+       if (pm_runtime_enabled(dev))
+               return;
+
+       if (dev->power.runtime_status == RPM_ACTIVE)
+               pm_runtime_set_suspended(dev);
+
+       if (dev->power.irq_safe) {
+               spin_lock_irq(&dev->power.lock);
+               dev->power.irq_safe = 0;
+               spin_unlock_irq(&dev->power.lock);
+               if (dev->parent)
+                       pm_runtime_put(dev->parent);
        }
        /*
         * Clear power.needs_force_resume in case it has been set by