Commit 359afc8e authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

PM: runtime: Do not clear needs_force_resume with enabled runtime PM



Commit 89d9cec3 ("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: 89d9cec3 ("PM: runtime: Clear power.needs_force_resume in pm_runtime_reinit()")
Reported-by: default avatarEd Tsai <ed.tsai@mediatek.com>
Closes: https://lore.kernel.org/linux-pm/20251215122154.3180001-1-ed.tsai@mediatek.com/

 [1]
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: 6.17+ <stable@vger.kernel.org> # 6.17+
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Link: https://patch.msgid.link/12807571.O9o76ZdvQC@rafael.j.wysocki
parent 8f0b4cce
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -1868,9 +1868,12 @@ void pm_runtime_init(struct device *dev)
 */
void pm_runtime_reinit(struct device *dev)
{
	if (!pm_runtime_enabled(dev)) {
	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;
@@ -1878,7 +1881,6 @@ void pm_runtime_reinit(struct device *dev)
		if (dev->parent)
			pm_runtime_put(dev->parent);
	}
	}
	/*
	 * Clear power.needs_force_resume in case it has been set by
	 * pm_runtime_force_suspend() invoked from a driver remove callback.