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@wunner.de cc: Rafael J. Wysocki rafael.j.wysocki@intel.com cc: Thierry Reding thierry.reding@gmail.com Signed-off-by: Jyri Sarha jsarha@ti.com
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)) {