On Mon, Feb 15, 2021 at 12:16 PM Geert Uytterhoeven <geert+rene...@glider.be> wrote: > > With fw_devlink=permissive, devices are added to the deferred probe > pending list if their driver's .probe() method returns -EPROBE_DEFER. > > With fw_devlink=on, devices are added to the deferred probe pending list > if they are determined to be a consumer, which happens before their > driver's .probe() method is called. If the actual probe fails later > (real failure, not -EPROBE_DEFER), the device will still be on the > deferred probe pending list, and it will be probed again when deferred > probing kicks in, which is futile. > > Fix this by explicitly removing the device from the deferred probe > pending list in case of probe failures. > > Fixes: e590474768f1cc04 ("driver core: Set fw_devlink=on by default") > Signed-off-by: Geert Uytterhoeven <geert+rene...@glider.be>
Good catch: Reviewed-by: Rafael J. Wysocki <rafael.j.wyso...@intel.com> > --- > Seen on various Renesas R-Car platforms, cfr. > https://lore.kernel.org/linux-acpi/camuhmdvl-1rkj5u-hdva4f4w_+8ygvqqujqbczmsdv4yxzz...@mail.gmail.com > --- > drivers/base/dd.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index 9179825ff646f4e3..91c4181093c43709 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -639,11 +639,13 @@ static int really_probe(struct device *dev, struct > device_driver *drv) > case -ENXIO: > pr_debug("%s: probe of %s rejects match %d\n", > drv->name, dev_name(dev), ret); > + driver_deferred_probe_del(dev); > break; > default: > /* driver matched but the probe failed */ > pr_warn("%s: probe of %s failed with error %d\n", > drv->name, dev_name(dev), ret); > + driver_deferred_probe_del(dev); > } > /* > * Ignore errors returned by ->probe so that the next driver can try > -- > 2.25.1 >