lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <47028492.fMDQidcC6G@rjwysocki.net>
Date: Tue, 11 Feb 2025 22:21:23 +0100
From: "Rafael J. Wysocki" <rjw@...ysocki.net>
To: Linux PM <linux-pm@...r.kernel.org>
Cc: LKML <linux-kernel@...r.kernel.org>,
 Alan Stern <stern@...land.harvard.edu>, Ulf Hansson <ulf.hansson@...aro.org>,
 Johan Hovold <johan@...nel.org>,
 Manivannan Sadhasivam <manivannan.sadhasivam@...aro.org>,
 Jon Hunter <jonathanh@...dia.com>
Subject:
 [PATCH v1 09/10] PM: sleep: Propagate power.set_active in dependency chains

From: Rafael J. Wysocki <rafael.j.wysocki@...el.com>

After preparing pm_runtime_force_resume() for dealing with devices
having power.set_active set, make the core propagate that flag in
dependency chains, so that subordinate device are resumed along with
the ones that they depend on, but take exceptions into account.

Namely, do not set power.set_active for devices that have never had
runtime PM enabled, for parents that have power.ignore_children set and
for suppliers coming from device links with DL_FLAG_PM_RUNTIME unset.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@...el.com>
---
 drivers/base/power/main.c |   25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1189,18 +1189,31 @@
 	return PMSG_ON;
 }
 
+static void dpm_cond_set_active(struct device *dev, bool cond)
+{
+	if (cond && !pm_runtime_no_support(dev))
+		dev->power.set_active = true;
+}
+
 static void dpm_superior_set_must_resume(struct device *dev)
 {
+	bool set_active = dev->power.set_active;
 	struct device_link *link;
 	int idx;
 
-	if (dev->parent)
+	if (dev->parent) {
 		dev->parent->power.must_resume = true;
+		dpm_cond_set_active(dev->parent, set_active &&
+				    !dev->parent->power.ignore_children);
+	}
 
 	idx = device_links_read_lock();
 
-	list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node)
+	list_for_each_entry_rcu_locked(link, &dev->links.suppliers, c_node) {
 		link->supplier->power.must_resume = true;
+		dpm_cond_set_active(link->supplier, set_active &&
+				    (link->flags & DL_FLAG_PM_RUNTIME));
+	}
 
 	device_links_read_unlock(idx);
 }
@@ -1277,13 +1290,7 @@
 		dev->power.must_resume = true;
 
 	if (dev->power.must_resume) {
-		if (dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) &&
-		    !pm_runtime_no_support(dev)) {
-			dev->power.set_active = true;
-			if (dev->parent && !dev->parent->power.ignore_children &&
-			    !pm_runtime_no_support(dev->parent))
-				dev->parent->power.set_active = true;
-		}
+		dpm_cond_set_active(dev, dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND));
 		dpm_superior_set_must_resume(dev);
 	}
 




Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ