Skip to content

Commit 0ff26c6

Browse files
ahunter6gregkh
authored andcommitted
driver core: Fix device link deferred probe
A device probe deferred because of a device link is never probed again because it is not added to the deferred_probe_pending_list. Add it, taking care of the race with driver_deferred_probe_trigger(). Signed-off-by: Adrian Hunter <[email protected]> Reviewed-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2b2d878 commit 0ff26c6

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

drivers/base/dd.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,15 @@ EXPORT_SYMBOL_GPL(device_bind_driver);
350350
static atomic_t probe_count = ATOMIC_INIT(0);
351351
static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue);
352352

353+
static void driver_deferred_probe_add_trigger(struct device *dev,
354+
int local_trigger_count)
355+
{
356+
driver_deferred_probe_add(dev);
357+
/* Did a trigger occur while probing? Need to re-trigger if yes */
358+
if (local_trigger_count != atomic_read(&deferred_trigger_count))
359+
driver_deferred_probe_trigger();
360+
}
361+
353362
static int really_probe(struct device *dev, struct device_driver *drv)
354363
{
355364
int ret = -EPROBE_DEFER;
@@ -369,6 +378,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
369378
}
370379

371380
ret = device_links_check_suppliers(dev);
381+
if (ret == -EPROBE_DEFER)
382+
driver_deferred_probe_add_trigger(dev, local_trigger_count);
372383
if (ret)
373384
return ret;
374385

@@ -469,10 +480,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
469480
case -EPROBE_DEFER:
470481
/* Driver requested deferred probing */
471482
dev_dbg(dev, "Driver %s requests probe deferral\n", drv->name);
472-
driver_deferred_probe_add(dev);
473-
/* Did a trigger occur while probing? Need to re-trigger if yes */
474-
if (local_trigger_count != atomic_read(&deferred_trigger_count))
475-
driver_deferred_probe_trigger();
483+
driver_deferred_probe_add_trigger(dev, local_trigger_count);
476484
break;
477485
case -ENODEV:
478486
case -ENXIO:

0 commit comments

Comments
 (0)