linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Linux ACPI <linux-acpi@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Linux PM <linux-pm@vger.kernel.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>
Subject: [PATCH v1 11/16] ACPI: scan: Walk ACPI device's children using driver core
Date: Thu, 09 Jun 2022 16:07:17 +0200	[thread overview]
Message-ID: <3639830.MHq7AAxBmi@kreacher> (raw)
In-Reply-To: <1843211.tdWV9SEqCh@kreacher>

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

Instead of walking the list of children of an ACPI device directly, use
acpi_dev_for_each_child() or acpi_dev_for_each_child_reverse() to carry
out an action for all of the given ACPI device's children.

This will help to eliminate the children list head from struct
acpi_device as it is redundant and it is used in questionable ways
in some places (in particular, locking is needed for walking the
list pointed to it safely, but it is often missing).

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/acpi/scan.c |   59 +++++++++++++++++++++++++---------------------------
 1 file changed, 29 insertions(+), 30 deletions(-)

Index: linux-pm/drivers/acpi/scan.c
===================================================================
--- linux-pm.orig/drivers/acpi/scan.c
+++ linux-pm/drivers/acpi/scan.c
@@ -334,10 +334,9 @@ static int acpi_scan_device_check(struct
 	return error;
 }
 
-static int acpi_scan_bus_check(struct acpi_device *adev)
+static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used)
 {
 	struct acpi_scan_handler *handler = adev->handler;
-	struct acpi_device *child;
 	int error;
 
 	acpi_bus_get_status(adev);
@@ -353,19 +352,14 @@ static int acpi_scan_bus_check(struct ac
 		dev_warn(&adev->dev, "Namespace scan failure\n");
 		return error;
 	}
-	list_for_each_entry(child, &adev->children, node) {
-		error = acpi_scan_bus_check(child);
-		if (error)
-			return error;
-	}
-	return 0;
+	return acpi_dev_for_each_child(adev, acpi_scan_bus_check, NULL);
 }
 
 static int acpi_generic_hotplug_event(struct acpi_device *adev, u32 type)
 {
 	switch (type) {
 	case ACPI_NOTIFY_BUS_CHECK:
-		return acpi_scan_bus_check(adev);
+		return acpi_scan_bus_check(adev, NULL);
 	case ACPI_NOTIFY_DEVICE_CHECK:
 		return acpi_scan_device_check(adev);
 	case ACPI_NOTIFY_EJECT_REQUEST:
@@ -2187,9 +2181,8 @@ static int acpi_scan_attach_handler(stru
 	return ret;
 }
 
-static void acpi_bus_attach(struct acpi_device *device, bool first_pass)
+static int acpi_bus_attach(struct acpi_device *device, void *first_pass)
 {
-	struct acpi_device *child;
 	bool skip = !first_pass && device->flags.visited;
 	acpi_handle ejd;
 	int ret;
@@ -2206,7 +2199,7 @@ static void acpi_bus_attach(struct acpi_
 		device->flags.initialized = false;
 		acpi_device_clear_enumerated(device);
 		device->flags.power_manageable = 0;
-		return;
+		return 0;
 	}
 	if (device->handler)
 		goto ok;
@@ -2224,7 +2217,7 @@ static void acpi_bus_attach(struct acpi_
 
 	ret = acpi_scan_attach_handler(device);
 	if (ret < 0)
-		return;
+		return 0;
 
 	device->flags.match_driver = true;
 	if (ret > 0 && !device->flags.enumeration_by_parent) {
@@ -2234,19 +2227,20 @@ static void acpi_bus_attach(struct acpi_
 
 	ret = device_attach(&device->dev);
 	if (ret < 0)
-		return;
+		return 0;
 
 	if (device->pnp.type.platform_id || device->flags.enumeration_by_parent)
 		acpi_default_enumeration(device);
 	else
 		acpi_device_set_enumerated(device);
 
- ok:
-	list_for_each_entry(child, &device->children, node)
-		acpi_bus_attach(child, first_pass);
+ok:
+	acpi_dev_for_each_child(device, acpi_bus_attach, first_pass);
 
 	if (!skip && device->handler && device->handler->hotplug.notify_online)
 		device->handler->hotplug.notify_online(device);
+
+	return 0;
 }
 
 static int acpi_dev_get_first_consumer_dev_cb(struct acpi_dep_data *dep, void *data)
@@ -2274,7 +2268,7 @@ static void acpi_scan_clear_dep_fn(struc
 	cdw = container_of(work, struct acpi_scan_clear_dep_work, work);
 
 	acpi_scan_lock_acquire();
-	acpi_bus_attach(cdw->adev, true);
+	acpi_bus_attach(cdw->adev, (void *)true);
 	acpi_scan_lock_release();
 
 	acpi_dev_put(cdw->adev);
@@ -2432,7 +2426,7 @@ int acpi_bus_scan(acpi_handle handle)
 	if (!device)
 		return -ENODEV;
 
-	acpi_bus_attach(device, true);
+	acpi_bus_attach(device, (void *)true);
 
 	if (!acpi_bus_scan_second_pass)
 		return 0;
@@ -2446,25 +2440,17 @@ int acpi_bus_scan(acpi_handle handle)
 				    acpi_bus_check_add_2, NULL, NULL,
 				    (void **)&device);
 
-	acpi_bus_attach(device, false);
+	acpi_bus_attach(device, NULL);
 
 	return 0;
 }
 EXPORT_SYMBOL(acpi_bus_scan);
 
-/**
- * acpi_bus_trim - Detach scan handlers and drivers from ACPI device objects.
- * @adev: Root of the ACPI namespace scope to walk.
- *
- * Must be called under acpi_scan_lock.
- */
-void acpi_bus_trim(struct acpi_device *adev)
+int acpi_bus_trim_one(struct acpi_device *adev, void *not_used)
 {
 	struct acpi_scan_handler *handler = adev->handler;
-	struct acpi_device *child;
 
-	list_for_each_entry_reverse(child, &adev->children, node)
-		acpi_bus_trim(child);
+	acpi_dev_for_each_child_reverse(adev, acpi_bus_trim_one, NULL);
 
 	adev->flags.match_driver = false;
 	if (handler) {
@@ -2482,6 +2468,19 @@ void acpi_bus_trim(struct acpi_device *a
 	acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
 	adev->flags.initialized = false;
 	acpi_device_clear_enumerated(adev);
+
+	return 0;
+}
+
+/**
+ * acpi_bus_trim - Detach scan handlers and drivers from ACPI device objects.
+ * @adev: Root of the ACPI namespace scope to walk.
+ *
+ * Must be called under acpi_scan_lock.
+ */
+void acpi_bus_trim(struct acpi_device *adev)
+{
+	acpi_bus_trim_one(adev, NULL);
 }
 EXPORT_SYMBOL_GPL(acpi_bus_trim);
 




  parent reply	other threads:[~2022-06-09 14:20 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-09 13:44 [PATCH v1 00/16] ACPI: Get rid of the list of children in struct acpi_device Rafael J. Wysocki
2022-06-09 13:47 ` [PATCH v1 01/16] ACPI: glue: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 13:49 ` [PATCH v1 02/16] ACPI: glue: Introduce acpi_dev_has_children() Rafael J. Wysocki
2022-06-09 13:54 ` [PATCH v1 03/16] ACPI: glue: Introduce acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-09 13:54 ` [PATCH v1 04/16] thunderbolt: ACPI: Use acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-09 15:25   ` Andy Shevchenko
2022-06-09 15:36     ` Rafael J. Wysocki
2022-06-10  6:46   ` Heikki Krogerus
2022-06-10 13:12     ` Rafael J. Wysocki
2022-06-09 13:56 ` [PATCH v1 05/16] USB: " Rafael J. Wysocki
2022-06-09 15:27   ` Andy Shevchenko
2022-06-09 15:37     ` Rafael J. Wysocki
2022-06-10  6:47   ` Heikki Krogerus
2022-06-10 13:14     ` Rafael J. Wysocki
2022-06-09 13:58 ` [PATCH v1 06/16] ACPI: container: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:29   ` Andy Shevchenko
2022-06-09 15:58     ` Rafael J. Wysocki
2022-06-09 13:59 ` [PATCH v1 07/16] ACPI: property: Use acpi_dev_for_each_child() for child lookup Rafael J. Wysocki
2022-06-09 14:02 ` [PATCH v1 08/16] ACPI: bus: Export acpi_dev_for_each_child() to modules Rafael J. Wysocki
2022-06-09 14:03 ` [PATCH v1 09/16] ACPI: video: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:40   ` Andy Shevchenko
2022-06-09 14:06 ` [PATCH v1 10/16] ACPI: bus: Introduce acpi_dev_for_each_child_reverse() Rafael J. Wysocki
2022-06-09 15:40   ` Andy Shevchenko
2022-06-09 14:07 ` Rafael J. Wysocki [this message]
2022-06-09 14:09 ` [PATCH v1 12/16] platform/x86/thinkpad_acpi: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-09 15:48   ` Andy Shevchenko
2022-06-09 15:56     ` Rafael J. Wysocki
2022-06-09 14:12 ` [PATCH v1 13/16] mfd: core: " Rafael J. Wysocki
2022-06-09 14:16 ` [PATCH v1 14/16] soundwire: " Rafael J. Wysocki
2022-06-09 15:22   ` Pierre-Louis Bossart
2022-06-09 16:13     ` Rafael J. Wysocki
2022-06-09 16:21       ` Pierre-Louis Bossart
2022-06-09 17:35         ` Rafael J. Wysocki
2022-06-09 19:08           ` Pierre-Louis Bossart
2022-06-09 14:18 ` [PATCH v1 15/16] ACPI / MMC: PM: Unify fixing up device power Rafael J. Wysocki
2022-06-09 15:33   ` Adrian Hunter
2022-06-10 12:16   ` Ulf Hansson
2022-06-09 14:19 ` [PATCH v1 16/16] ACPI: bus: Drop unused list heads from struct acpi_device Rafael J. Wysocki
2022-06-09 15:12 ` [PATCH v1 00/16] ACPI: Get rid of the list of children in " Andy Shevchenko
2022-06-09 20:24   ` Frank Rowand
2022-06-09 15:56 ` Andy Shevchenko
2022-06-09 15:59   ` Rafael J. Wysocki
2022-06-13 18:03 ` [PATCH v2 " Rafael J. Wysocki
2022-06-13 18:05   ` [PATCH v2 01/16] ACPI: glue: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:06   ` [PATCH v2 02/16] ACPI: glue: Introduce acpi_dev_has_children() Rafael J. Wysocki
2022-06-13 18:10   ` [PATCH v2 03/16] ACPI: glue: Introduce acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:11   ` [PATCH v2 04/16] thunderbolt: ACPI: Replace tb_acpi_find_port() with acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:55     ` Andy Shevchenko
2022-06-14  6:07     ` Mika Westerberg
2022-06-14 18:25       ` Rafael J. Wysocki
2022-06-15  6:27         ` Mika Westerberg
2022-06-15 19:52           ` Rafael J. Wysocki
2022-06-14  7:36     ` Heikki Krogerus
2022-06-13 18:15   ` [PATCH v2 06/16] ACPI: container: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:16   ` [PATCH v2 07/16] ACPI: property: Use acpi_dev_for_each_child() for child lookup Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 08/16] ACPI: bus: Export acpi_dev_for_each_child() to modules Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 09/16] ACPI: video: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:26   ` [PATCH v2 10/16] ACPI: bus: Introduce acpi_dev_for_each_child_reverse() Rafael J. Wysocki
2022-06-13 18:27   ` [PATCH v2 11/16] ACPI: scan: Walk ACPI device's children using driver core Rafael J. Wysocki
2022-06-13 18:30   ` [PATCH v2 12/16] platform/x86/thinkpad_acpi: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-13 18:54     ` Andy Shevchenko
2022-06-13 20:50     ` Hans de Goede
2022-06-13 18:31   ` [PATCH v2 13/16] mfd: core: " Rafael J. Wysocki
2022-06-15 22:39     ` Lee Jones
2022-06-16 17:31       ` Rafael J. Wysocki
2022-06-27 11:38     ` [GIT PULL] Immutable branch between MFD and ACPI due for the v5.20 merge window Lee Jones
2022-06-27 12:15       ` Rafael J. Wysocki
2022-06-13 18:35   ` [PATCH v2 14/16] soundwire: Use acpi_dev_for_each_child() Rafael J. Wysocki
2022-06-23  8:10     ` Vinod Koul
2022-06-23 12:29       ` Rafael J. Wysocki
2022-06-23 12:41         ` Vinod Koul
2022-06-23 13:26           ` Rafael J. Wysocki
2022-06-13 18:36   ` [PATCH v2 15/16] ACPI / MMC: PM: Unify fixing up device power Rafael J. Wysocki
2022-06-13 18:38   ` [PATCH v2 16/16] ACPI: bus: Drop unused list heads from struct acpi_device Rafael J. Wysocki
2022-06-13 18:39   ` [PATCH v2 05/16] USB: ACPI: Replace usb_acpi_find_port() with acpi_find_child_by_adr() Rafael J. Wysocki
2022-06-13 18:53     ` Andy Shevchenko
2022-06-14  7:37     ` Heikki Krogerus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3639830.MHq7AAxBmi@kreacher \
    --to=rjw@rjwysocki.net \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=hdegoede@redhat.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=sakari.ailus@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).