mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
PM: runtime: Do not clear needs_force_resume with enabled runtime PM
Commit89d9cec3b1("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:89d9cec3b1("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
This commit is contained in:
@@ -1868,16 +1868,18 @@ void pm_runtime_init(struct device *dev)
|
|||||||
*/
|
*/
|
||||||
void pm_runtime_reinit(struct device *dev)
|
void pm_runtime_reinit(struct device *dev)
|
||||||
{
|
{
|
||||||
if (!pm_runtime_enabled(dev)) {
|
if (pm_runtime_enabled(dev))
|
||||||
if (dev->power.runtime_status == RPM_ACTIVE)
|
return;
|
||||||
pm_runtime_set_suspended(dev);
|
|
||||||
if (dev->power.irq_safe) {
|
if (dev->power.runtime_status == RPM_ACTIVE)
|
||||||
spin_lock_irq(&dev->power.lock);
|
pm_runtime_set_suspended(dev);
|
||||||
dev->power.irq_safe = 0;
|
|
||||||
spin_unlock_irq(&dev->power.lock);
|
if (dev->power.irq_safe) {
|
||||||
if (dev->parent)
|
spin_lock_irq(&dev->power.lock);
|
||||||
pm_runtime_put(dev->parent);
|
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
|
* Clear power.needs_force_resume in case it has been set by
|
||||||
|
|||||||
Reference in New Issue
Block a user