Skip to content

Commit 359afc8

Browse files
committed
PM: runtime: Do not clear needs_force_resume with enabled runtime PM
Commit 89d9cec ("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: 89d9cec ("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
1 parent 8f0b4cc commit 359afc8

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
@@ -1868,16 +1868,18 @@ void pm_runtime_init(struct device *dev)
18681868
*/
18691869
void pm_runtime_reinit(struct device *dev)
18701870
{
1871-
if (!pm_runtime_enabled(dev)) {
1872-
if (dev->power.runtime_status == RPM_ACTIVE)
1873-
pm_runtime_set_suspended(dev);
1874-
if (dev->power.irq_safe) {
1875-
spin_lock_irq(&dev->power.lock);
1876-
dev->power.irq_safe = 0;
1877-
spin_unlock_irq(&dev->power.lock);
1878-
if (dev->parent)
1879-
pm_runtime_put(dev->parent);
1880-
}
1871+
if (pm_runtime_enabled(dev))
1872+
return;
1873+
1874+
if (dev->power.runtime_status == RPM_ACTIVE)
1875+
pm_runtime_set_suspended(dev);
1876+
1877+
if (dev->power.irq_safe) {
1878+
spin_lock_irq(&dev->power.lock);
1879+
dev->power.irq_safe = 0;
1880+
spin_unlock_irq(&dev->power.lock);
1881+
if (dev->parent)
1882+
pm_runtime_put(dev->parent);
18811883
}
18821884
/*
18831885
* Clear power.needs_force_resume in case it has been set by

0 commit comments

Comments
 (0)