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

Simon Glass sjg at chromium.org
Fri Sep 11 02:38:41 CEST 2015


Hi Bin,

On 10 September 2015 at 00:07, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Thu, Sep 10, 2015 at 2:07 AM, Simon Glass <sjg at chromium.org> wrote:
>> 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.
>>
>
> Yes, but doing uclass_pre_remove_device() should not bring any harm,
> given we already want to remove this device, right?

That function is entitled to assume that the device was set up at
least to the post_remove uclass state. Here that would not be try, so
we are creating an entirely new test case.

>
>> 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