Re: [PATCH v2] ACPI: scan: fix bus ID cleanup on device_add() failure

"Rafael J. Wysocki (Intel)" <[email protected]>
Newsgroups gmane.linux.acpi.devel
Message-ID <CAJZ5v0i05zUkpz01nTAh0R_rha7fqfhH1gWDpKFzmfZczHyHXw@mail.gmail.com>
On Sat, Aug 8, 2026 at 10:59 AM Hongyan Xu <[email protected]> wrote:
>
> 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]>

Applied (with some non-essential modifications) as 7.3 material, thanks!

> ---
> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.