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. 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)) { _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel