Takashi Iwai ad473a
From c1013ff7a5472db637c56bb6237f8343398c03a7 Mon Sep 17 00:00:00 2001
Takashi Iwai ad473a
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Takashi Iwai ad473a
Date: Thu, 14 Jan 2021 19:46:47 +0100
Takashi Iwai ad473a
Subject: [PATCH] ACPI: scan: Rearrange memory allocation in acpi_device_add()
Takashi Iwai ad473a
Git-commit: c1013ff7a5472db637c56bb6237f8343398c03a7
Takashi Iwai ad473a
Patch-mainline: v5.12-rc1
Takashi Iwai ad473a
References: git-fixes
Takashi Iwai ad473a
Takashi Iwai ad473a
The upfront allocation of new_bus_id is done to avoid allocating
Takashi Iwai ad473a
memory under acpi_device_lock, but it doesn't really help,
Takashi Iwai ad473a
because (1) it leads to many unnecessary memory allocations for
Takashi Iwai ad473a
_ADR devices, (2) kstrdup_const() is run under that lock anyway and
Takashi Iwai ad473a
(3) it complicates the code.
Takashi Iwai ad473a
Takashi Iwai ad473a
Rearrange acpi_device_add() to allocate memory for a new struct
Takashi Iwai ad473a
acpi_device_bus_id instance only when necessary, eliminate a redundant
Takashi Iwai ad473a
local variable from it and reduce the number of labels in there.
Takashi Iwai ad473a
Takashi Iwai ad473a
No intentional functional impact.
Takashi Iwai ad473a
Takashi Iwai ad473a
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Takashi Iwai ad473a
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Takashi Iwai ad473a
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai ad473a
Takashi Iwai ad473a
---
Takashi Iwai ad473a
 drivers/acpi/scan.c | 57 +++++++++++++++++++++------------------------
Takashi Iwai ad473a
 1 file changed, 26 insertions(+), 31 deletions(-)
Takashi Iwai ad473a
Takashi Iwai ad473a
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
Takashi Iwai ad473a
index 1db063b02f63..0fb1811772b5 100644
Takashi Iwai ad473a
--- a/drivers/acpi/scan.c
Takashi Iwai ad473a
+++ b/drivers/acpi/scan.c
Takashi Iwai ad473a
@@ -623,12 +623,23 @@ void acpi_bus_put_acpi_device(struct acpi_device *adev)
Takashi Iwai ad473a
 	put_device(&adev->dev);
Takashi Iwai ad473a
 }
Takashi Iwai ad473a
 
Takashi Iwai ad473a
+static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id)
Takashi Iwai ad473a
+{
Takashi Iwai ad473a
+	struct acpi_device_bus_id *acpi_device_bus_id;
Takashi Iwai ad473a
+
Takashi Iwai ad473a
+	/* Find suitable bus_id and instance number in acpi_bus_id_list. */
Takashi Iwai ad473a
+	list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
Takashi Iwai ad473a
+		if (!strcmp(acpi_device_bus_id->bus_id, dev_id))
Takashi Iwai ad473a
+			return acpi_device_bus_id;
Takashi Iwai ad473a
+	}
Takashi Iwai ad473a
+	return NULL;
Takashi Iwai ad473a
+}
Takashi Iwai ad473a
+
Takashi Iwai ad473a
 int acpi_device_add(struct acpi_device *device,
Takashi Iwai ad473a
 		    void (*release)(struct device *))
Takashi Iwai ad473a
 {
Takashi Iwai ad473a
+	struct acpi_device_bus_id *acpi_device_bus_id;
Takashi Iwai ad473a
 	int result;
Takashi Iwai ad473a
-	struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id;
Takashi Iwai ad473a
-	int found = 0;
Takashi Iwai ad473a
 
Takashi Iwai ad473a
 	if (device->handle) {
Takashi Iwai ad473a
 		acpi_status status;
Takashi Iwai ad473a
@@ -654,38 +665,26 @@ int acpi_device_add(struct acpi_device *device,
Takashi Iwai ad473a
 	INIT_LIST_HEAD(&device->del_list);
Takashi Iwai ad473a
 	mutex_init(&device->physical_node_lock);
Takashi Iwai ad473a
 
Takashi Iwai ad473a
-	new_bus_id = kzalloc(sizeof(struct acpi_device_bus_id), GFP_KERNEL);
Takashi Iwai ad473a
-	if (!new_bus_id) {
Takashi Iwai ad473a
-		pr_err(PREFIX "Memory allocation error\n");
Takashi Iwai ad473a
-		result = -ENOMEM;
Takashi Iwai ad473a
-		goto err_detach;
Takashi Iwai ad473a
-	}
Takashi Iwai ad473a
-
Takashi Iwai ad473a
 	mutex_lock(&acpi_device_lock);
Takashi Iwai ad473a
-	/*
Takashi Iwai ad473a
-	 * Find suitable bus_id and instance number in acpi_bus_id_list
Takashi Iwai ad473a
-	 * If failed, create one and link it into acpi_bus_id_list
Takashi Iwai ad473a
-	 */
Takashi Iwai ad473a
-	list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) {
Takashi Iwai ad473a
-		if (!strcmp(acpi_device_bus_id->bus_id,
Takashi Iwai ad473a
-			    acpi_device_hid(device))) {
Takashi Iwai ad473a
-			acpi_device_bus_id->instance_no++;
Takashi Iwai ad473a
-			found = 1;
Takashi Iwai ad473a
-			kfree(new_bus_id);
Takashi Iwai ad473a
-			break;
Takashi Iwai ad473a
+
Takashi Iwai ad473a
+	acpi_device_bus_id = acpi_device_bus_id_match(acpi_device_hid(device));
Takashi Iwai ad473a
+	if (acpi_device_bus_id) {
Takashi Iwai ad473a
+		acpi_device_bus_id->instance_no++;
Takashi Iwai ad473a
+	} else {
Takashi Iwai ad473a
+		acpi_device_bus_id = kzalloc(sizeof(*acpi_device_bus_id),
Takashi Iwai ad473a
+					     GFP_KERNEL);
Takashi Iwai ad473a
+		if (!acpi_device_bus_id) {
Takashi Iwai ad473a
+			result = -ENOMEM;
Takashi Iwai ad473a
+			goto err_unlock;
Takashi Iwai ad473a
 		}
Takashi Iwai ad473a
-	}
Takashi Iwai ad473a
-	if (!found) {
Takashi Iwai ad473a
-		acpi_device_bus_id = new_bus_id;
Takashi Iwai ad473a
 		acpi_device_bus_id->bus_id =
Takashi Iwai ad473a
 			kstrdup_const(acpi_device_hid(device), GFP_KERNEL);
Takashi Iwai ad473a
 		if (!acpi_device_bus_id->bus_id) {
Takashi Iwai ad473a
-			pr_err(PREFIX "Memory allocation error for bus id\n");
Takashi Iwai ad473a
+			kfree(acpi_device_bus_id);
Takashi Iwai ad473a
 			result = -ENOMEM;
Takashi Iwai ad473a
-			goto err_free_new_bus_id;
Takashi Iwai ad473a
+			goto err_unlock;
Takashi Iwai ad473a
 		}
Takashi Iwai ad473a
 
Takashi Iwai ad473a
-		acpi_device_bus_id->instance_no = 0;
Takashi Iwai ad473a
 		list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
Takashi Iwai ad473a
 	}
Takashi Iwai ad473a
 	dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
Takashi Iwai ad473a
@@ -720,13 +719,9 @@ int acpi_device_add(struct acpi_device *device,
Takashi Iwai ad473a
 		list_del(&device->node);
Takashi Iwai ad473a
 	list_del(&device->wakeup_list);
Takashi Iwai ad473a
 
Takashi Iwai ad473a
- err_free_new_bus_id:
Takashi Iwai ad473a
-	if (!found)
Takashi Iwai ad473a
-		kfree(new_bus_id);
Takashi Iwai ad473a
-
Takashi Iwai ad473a
+ err_unlock:
Takashi Iwai ad473a
 	mutex_unlock(&acpi_device_lock);
Takashi Iwai ad473a
 
Takashi Iwai ad473a
- err_detach:
Takashi Iwai ad473a
 	acpi_detach_data(device->handle, acpi_scan_drop_device);
Takashi Iwai ad473a
 	return result;
Takashi Iwai ad473a
 }
Takashi Iwai ad473a
-- 
Takashi Iwai ad473a
2.26.2
Takashi Iwai ad473a