]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 Jan 2026 11:57:22 +0000 (12:57 +0100)
commit 359afc8eb02a518fbdd0cbd462c8c2827c6cbec2 upstream.

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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/power/runtime.c

index 1b11a3cd4acc27db776a54dada0bfbc40330de2b..e882b5269ebec459faf0b7412b322e5798141f33 100644 (file)
@@ -1869,16 +1869,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