[PATCH v2] ACPI: scan: fix bus ID cleanup on device_add() failure
Hongyan Xu <[email protected]> Sat, 8 Aug 2026 16:59:42 +0800
| Newsgroups | gmane.linux.acpi.devel |
|---|---|
| Message-ID | <[email protected]> |
When device_add() fails after acpi_device_set_name() has allocated an instance ID and linked a new acpi_device_bus_id into acpi_bus_id_list, the rollback path only removes wakeup_list and detaches the ACPI handle data. That leaves the bus-ID bookkeeping behind and keeps the allocated instance number consumed. Move the bus-ID cleanup and wakeup-list removal into a single helper. Use it from both the normal device teardown path and the device_add() rollback path. The wakeup list node is initialized before registration, so it can be deleted without checking whether the device is wakeup-capable, as in the original teardown path. Found by manual review of reports from the kernel70rc2-fail11-retry-20260801 run. Signed-off-by: Hongyan Xu <[email protected]> --- v2: - Fold the bus-ID cleanup and wakeup-list removal into one helper to avoid duplicating the same sequence in acpi_device_del() and the device_add() rollback path. - Drop the wakeup.flags.valid check before list_del(&device->wakeup_list). v1: https://lore.kernel.org/linux-acpi/[email protected]/ drivers/acpi/scan.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index ff7000b71fd1..a311af60d8d3 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -520,12 +520,10 @@ static void acpi_device_release(struct device *dev) kfree(acpi_dev); } -static void acpi_device_del(struct acpi_device *device) +static void acpi_device_del_list(struct acpi_device *device) { struct acpi_device_bus_id *acpi_device_bus_id; - mutex_lock(&acpi_device_lock); - list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node) if (!strcmp(acpi_device_bus_id->bus_id, acpi_device_hid(device))) { @@ -540,6 +538,13 @@ static void acpi_device_del(struct acpi_device *device) } list_del(&device->wakeup_list); +} + +static void acpi_device_del(struct acpi_device *device) +{ + mutex_lock(&acpi_device_lock); + + acpi_device_del_list(device); mutex_unlock(&acpi_device_lock); @@ -800,7 +805,7 @@ int acpi_device_add(struct acpi_device *device) err: mutex_lock(&acpi_device_lock); - list_del(&device->wakeup_list); + acpi_device_del_list(device); err_unlock: mutex_unlock(&acpi_device_lock); -- 2.50.1.windows.1