Skip to content

Commit 146339d

Browse files
committed
Merge tag 'pm-6.14-rc2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management fix from Rafael Wysocki: "Fix a recently introduced kernel crash due to a NULL pointer dereference during system-wide suspend (Rafael Wysocki)" * tag 'pm-6.14-rc2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: PM: sleep: core: Restrict power.set_active propagation
2 parents 954a209 + 7585946 commit 146339d

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

drivers/base/power/main.c

+9-12
Original file line numberDiff line numberDiff line change
@@ -1191,24 +1191,18 @@ static pm_message_t resume_event(pm_message_t sleep_state)
11911191
return PMSG_ON;
11921192
}
11931193

1194-
static void dpm_superior_set_must_resume(struct device *dev, bool set_active)
1194+
static void dpm_superior_set_must_resume(struct device *dev)
11951195
{
11961196
struct device_link *link;
11971197
int idx;
11981198

1199-
if (dev->parent) {
1199+
if (dev->parent)
12001200
dev->parent->power.must_resume = true;
1201-
if (set_active)
1202-
dev->parent->power.set_active = true;
1203-
}
12041201

12051202
idx = device_links_read_lock();
12061203

1207-
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node) {
1204+
list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
12081205
link->supplier->power.must_resume = true;
1209-
if (set_active)
1210-
link->supplier->power.set_active = true;
1211-
}
12121206

12131207
device_links_read_unlock(idx);
12141208
}
@@ -1287,9 +1281,12 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state, bool asy
12871281
dev->power.must_resume = true;
12881282

12891283
if (dev->power.must_resume) {
1290-
dev->power.set_active = dev->power.set_active ||
1291-
dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND);
1292-
dpm_superior_set_must_resume(dev, dev->power.set_active);
1284+
if (dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND)) {
1285+
dev->power.set_active = true;
1286+
if (dev->parent && !dev->parent->power.ignore_children)
1287+
dev->parent->power.set_active = true;
1288+
}
1289+
dpm_superior_set_must_resume(dev);
12931290
}
12941291

12951292
Complete:

0 commit comments

Comments
 (0)