Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

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

+12 -10
+12 -10
drivers/base/power/runtime.c
··· 1868 1868 */ 1869 1869 void pm_runtime_reinit(struct device *dev) 1870 1870 { 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); 1881 1883 } 1882 1884 /* 1883 1885 * Clear power.needs_force_resume in case it has been set by