[U-Boot] [PATCH 4/5] dm: core: Remove the call to device_free()

Simon Glass sjg at chromium.org
Wed Sep 9 20:07:39 CEST 2015


Hi Bin,

On Friday, 4 September 2015, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> When something goes wrong during device_probe(), we just need do
> device_remove() which calls device_free() internally.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
>  drivers/core/device.c | 9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/core/device.c b/drivers/core/device.c
> index a6cd936..061a7ef 100644
> --- a/drivers/core/device.c
> +++ b/drivers/core/device.c
> @@ -316,19 +316,14 @@ int device_probe_child(struct udevice *dev, void *parent_priv)
>
>         ret = uclass_post_probe_device(dev);
>         if (ret)
> -               goto fail_uclass;
> +               goto fail;
>
>         return 0;
> -fail_uclass:
> +fail:
>         if (device_remove(dev)) {
>                 dm_warn("%s: Device '%s' failed to remove on error path\n",
>                         __func__, dev->name);
>         }
> -fail:
> -       dev->flags &= ~DM_FLAG_ACTIVATED;
> -
> -       dev->seq = -1;
> -       device_free(dev);
>
>         return ret;
>  }


The problem is that in this case you end up calling functions that
should not be called. For example uclass_pre_remove_device() will be
called even if uclass_post_probe_device() was not.

There is definitely room for improvement here - we could/should call
only those 'remove' functions that mirror the 'probe' ones we called.
But that is quite a lot of code for little benefit.

Regards,
Simon


>
>


More information about the U-Boot mailing list