Re: [PATCH RFC] driver core: Reprobe consumer if it was unbound by dropped device_link

From: Daniel Vetter
Date: Tue Aug 14 2018 - 10:17:32 EST


On Mon, Feb 26, 2018 at 8:52 AM, Jyri Sarha <jsarha@xxxxxx> wrote:
> On 25/02/18 11:22, Lukas Wunner wrote:
>> On Thu, Feb 22, 2018 at 07:42:46PM +0200, Jyri Sarha wrote:
>>> Put consumer device to deferred probe list if it is unbound due to a
>>> dropped link to a supplier.
>>>
>>> When a device link supplier is unbound (either manually or because one
>>> of its own suppliers was unbound), its consumers are unbound as
>>> well. Currently if the supplier binds again after this the consumer
>>> does not automatically probe again. With this patch it does.
>>
>> Yes I think this makes sense, based on the rationale that the consumer
>> was automatically unbound, so by symmetry it should also be automatically
>> rebound.
>>
>> The only thing I don't understand is you wrote in an earlier e-mail of a
>> difference in behavior depending on whether driver_deferred_probe_add()
>> is called before or after device_release_driver_internal().
>> That's really odd, it shouldn't make a difference.
>>
>
> In that version there was a couple of other bugs elsewhere in the
> system. I tried to reproduce that situation again multiple times, but I
> could not (even write those bugs back in there, and move the link
> creation back to panel bridge code). But even from reading the code that
> difference did not make any sense. I suspect a heisen-bug, after I have
> read the code and understood that the crash is not possible, it does not
> happen anymore :).
>
> With the current version I could not find any difference in behaviour
> depending on the order of device_release_driver_internal() and
> driver_deferred_probe_add() calls. I just thought having them in this
> order just lookes nicer.
>
> I stress tested the code by unloading and loading the panel driver in a
> tight loop, for several minutes, but it simply wont crash (not in this
> setup anyway). The probe of tilcdc eventually gracefully fails in a CMA
> failure.

Is this still moving or stuck? Pinging since Sean just brought up the
drm_bridge lifetime issues, and I think it'd be nice if we could solve
those by using device_link, like we've added already for drm_panel.
>From my very layman understanding of the discussions, device_link not
quite working for deferred probing is the blocker for this plan.

Also adding Sean.
-Daniel

>
> Best regards,
> Jyri
>
>> Thanks,
>>
>> Lukas
>>
>>>
>>> If this patch is not acceptable as such, how about adding this
>>> behavior behind a new device link flag?
>>>
>>> The idea to this patch was gotten from this post by Lucas Wunner:
>>> https://www.spinics.net/lists/dri-devel/msg166318.html
>>>
>>> Part of the code and the description is borrowed from him.
>>>
>>> cc: Lukas Wunner <lukas@xxxxxxxxx>
>>> cc: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
>>> cc: Thierry Reding <thierry.reding@xxxxxxxxx>
>>> Signed-off-by: Jyri Sarha <jsarha@xxxxxx>
>>> ---
>>> drivers/base/base.h | 1 +
>>> drivers/base/core.c | 2 ++
>>> drivers/base/dd.c | 2 +-
>>> 3 files changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/base/base.h b/drivers/base/base.h
>>> index d800de6..39370eb 100644
>>> --- a/drivers/base/base.h
>>> +++ b/drivers/base/base.h
>>> @@ -114,6 +114,7 @@ extern void device_release_driver_internal(struct device *dev,
>>>
>>> extern void driver_detach(struct device_driver *drv);
>>> extern int driver_probe_device(struct device_driver *drv, struct device *dev);
>>> +extern void driver_deferred_probe_add(struct device *dev);
>>> extern void driver_deferred_probe_del(struct device *dev);
>>> static inline int driver_match_device(struct device_driver *drv,
>>> struct device *dev)
>>> diff --git a/drivers/base/core.c b/drivers/base/core.c
>>> index b2261f9..0964ed5 100644
>>> --- a/drivers/base/core.c
>>> +++ b/drivers/base/core.c
>>> @@ -570,6 +570,8 @@ void device_links_unbind_consumers(struct device *dev)
>>>
>>> device_release_driver_internal(consumer, NULL,
>>> consumer->parent);
>>> + driver_deferred_probe_add(consumer);
>>> +
>>> put_device(consumer);
>>> goto start;
>>> }
>>> diff --git a/drivers/base/dd.c b/drivers/base/dd.c
>>> index de6fd09..846ae78 100644
>>> --- a/drivers/base/dd.c
>>> +++ b/drivers/base/dd.c
>>> @@ -140,7 +140,7 @@ static void deferred_probe_work_func(struct work_struct *work)
>>> }
>>> static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func);
>>>
>>> -static void driver_deferred_probe_add(struct device *dev)
>>> +void driver_deferred_probe_add(struct device *dev)
>>> {
>>> mutex_lock(&deferred_probe_mutex);
>>> if (list_empty(&dev->p->deferred_probe)) {
>
>
> --
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
> _______________________________________________
> dri-devel mailing list
> dri-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/dri-devel



--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch