Skip to content

Commit c389f11

Browse files
rafaeljwUlrich Hecht
authored andcommitted
PM: runtime: Do not clear needs_force_resume with enabled runtime PM
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> Signed-off-by: Ulrich Hecht <uli@kernel.org>
1 parent ddbe3f2 commit c389f11

1 file changed

Lines changed: 12 additions & 10 deletions

File tree

drivers/base/power/runtime.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,16 +1512,18 @@ void pm_runtime_init(struct device *dev)
15121512
*/
15131513
void pm_runtime_reinit(struct device *dev)
15141514
{
1515-
if (!pm_runtime_enabled(dev)) {
1516-
if (dev->power.runtime_status == RPM_ACTIVE)
1517-
pm_runtime_set_suspended(dev);
1518-
if (dev->power.irq_safe) {
1519-
spin_lock_irq(&dev->power.lock);
1520-
dev->power.irq_safe = 0;
1521-
spin_unlock_irq(&dev->power.lock);
1522-
if (dev->parent)
1523-
pm_runtime_put(dev->parent);
1524-
}
1515+
if (pm_runtime_enabled(dev))
1516+
return;
1517+
1518+
if (dev->power.runtime_status == RPM_ACTIVE)
1519+
pm_runtime_set_suspended(dev);
1520+
1521+
if (dev->power.irq_safe) {
1522+
spin_lock_irq(&dev->power.lock);
1523+
dev->power.irq_safe = 0;
1524+
spin_unlock_irq(&dev->power.lock);
1525+
if (dev->parent)
1526+
pm_runtime_put(dev->parent);
15251527
}
15261528
}
15271529

0 commit comments

Comments
 (0)