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

"Rafael J. Wysocki (Intel)" <[email protected]>
Newsgroups org.kernel.vger.linux-acpi
Message-ID <CAJZ5v0gOZK8pgAJyyOLYeX0Ky4hdi6m2o88PP3nQkq8DZbWDsw@mail.gmail.com>
On Tue, Aug 4, 2026 at 5:49 PM 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.
>
> Factor the bus-ID removal into a helper, use it from both the normal
> device teardown path and the device_add() rollback path, and only drop
> wakeup_list when it was actually linked.
>
> Found by manual review of reports from the
> kernel70rc2-fail11-retry-20260801 run.
>
> Signed-off-by: Hongyan Xu <[email protected]>
> ---
>  drivers/acpi/scan.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index ff7000b71..852682436 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_remove_bus_id(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))) {
> @@ -538,8 +536,16 @@ static void acpi_device_del(struct acpi_device *device)
>                         }
>                         break;
>                 }
> +}
>
> -       list_del(&device->wakeup_list);
> +static void acpi_device_del(struct acpi_device *device)
> +{
> +       mutex_lock(&acpi_device_lock);
> +
> +       acpi_device_remove_bus_id(device);
> +
> +       if (device->wakeup.flags.valid)
> +               list_del(&device->wakeup_list);
>
>         mutex_unlock(&acpi_device_lock);
>
> @@ -800,7 +806,9 @@ int acpi_device_add(struct acpi_device *device)
>  err:
>         mutex_lock(&acpi_device_lock);
>
> -       list_del(&device->wakeup_list);
> +       acpi_device_remove_bus_id(device);
> +       if (device->wakeup.flags.valid)
> +               list_del(&device->wakeup_list);

You have exactly the same code sequence in two places, so any chance
to avoid that duplication?

Also, it is not necessary to check device->wakeup.flags.valid before
doing list_del(&device->wakeup_list) if I'm not mistaken.

>
>  err_unlock:
>         mutex_unlock(&acpi_device_lock);
> --
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.