Message ID | 20220819221616.2107893-2-saravanak@google.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Bring back driver_deferred_probe_check_state() for now | expand |
Hi, On Fri, Aug 19, 2022 at 3:16 PM Saravana Kannan <saravanak@google.com> wrote: > > This reverts commit 9cbffc7a59561be950ecc675d19a3d2b45202b2b. > > There are a few more issues to fix that have been reported in the thread > for the original series [1]. We'll need to fix those before this will work. > So, revert it for now. > > [1] - https://lore.kernel.org/lkml/20220601070707.3946847-1-saravanak@google.com/ > > Fixes: 9cbffc7a5956 ("driver core: Delete driver_deferred_probe_check_state()") > Reviewed-by: Tony Lindgren <tony@atomide.com> > Tested-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Saravana Kannan <saravanak@google.com> > --- > drivers/base/dd.c | 30 ++++++++++++++++++++++++++++++ > include/linux/device/driver.h | 1 + > 2 files changed, 31 insertions(+) Tested-by: Douglas Anderson <dianders@chromium.org>
> Subject: [PATCH v2 1/4] Revert "driver core: Delete > driver_deferred_probe_check_state()" > > This reverts commit 9cbffc7a59561be950ecc675d19a3d2b45202b2b. > > There are a few more issues to fix that have been reported in the thread for > the original series [1]. We'll need to fix those before this will work. > So, revert it for now. > > [1] - > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > kernel.org%2Flkml%2F20220601070707.3946847-1- > saravanak%40google.com%2F&data=05%7C01%7Cpeng.fan%40nxp.co > m%7Ce9205a2ec9c049d2a68408da82307410%7C686ea1d3bc2b4c6fa92cd99 > c5c301635%7C0%7C0%7C637965441862478527%7CUnknown%7CTWFpbGZs > b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6M > n0%3D%7C3000%7C%7C%7C&sdata=tGjnNEQ6BwaNrxug9ceThYOlj0a3 > Gmds8qpwNcHf%2FH8%3D&reserved=0 > > Fixes: 9cbffc7a5956 ("driver core: Delete > driver_deferred_probe_check_state()") > Reviewed-by: Tony Lindgren <tony@atomide.com> > Tested-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Saravana Kannan <saravanak@google.com> Tested-by: Peng Fan <peng.fan@nxp.com> > --- > drivers/base/dd.c | 30 ++++++++++++++++++++++++++++++ > include/linux/device/driver.h | 1 + > 2 files changed, 31 insertions(+) > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c index > 70f79fc71539..a8916d1bfdcb 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -274,12 +274,42 @@ static int __init > deferred_probe_timeout_setup(char *str) } > __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); > > +/** > + * driver_deferred_probe_check_state() - Check deferred probe state > + * @dev: device to check > + * > + * Return: > + * * -ENODEV if initcalls have completed and modules are disabled. > + * * -ETIMEDOUT if the deferred probe timeout was set and has expired > + * and modules are enabled. > + * * -EPROBE_DEFER in other cases. > + * > + * Drivers or subsystems can opt-in to calling this function instead of > +directly > + * returning -EPROBE_DEFER. > + */ > +int driver_deferred_probe_check_state(struct device *dev) { > + if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { > + dev_warn(dev, "ignoring dependency for device, assuming > no driver\n"); > + return -ENODEV; > + } > + > + if (!driver_deferred_probe_timeout && initcalls_done) { > + dev_warn(dev, "deferred probe timeout, ignoring > dependency\n"); > + return -ETIMEDOUT; > + } > + > + return -EPROBE_DEFER; > +} > +EXPORT_SYMBOL_GPL(driver_deferred_probe_check_state); > + > static void deferred_probe_timeout_work_func(struct work_struct *work) > { > struct device_private *p; > > fw_devlink_drivers_done(); > > + driver_deferred_probe_timeout = 0; > driver_deferred_probe_trigger(); > flush_work(&deferred_probe_work); > > diff --git a/include/linux/device/driver.h b/include/linux/device/driver.h > index 7acaabde5396..2114d65b862f 100644 > --- a/include/linux/device/driver.h > +++ b/include/linux/device/driver.h > @@ -242,6 +242,7 @@ driver_find_device_by_acpi_dev(struct > device_driver *drv, const void *adev) > > extern int driver_deferred_probe_timeout; void > driver_deferred_probe_add(struct device *dev); > +int driver_deferred_probe_check_state(struct device *dev); > void driver_init(void); > > /** > -- > 2.37.1.595.g718a3a8f04-goog
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 70f79fc71539..a8916d1bfdcb 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -274,12 +274,42 @@ static int __init deferred_probe_timeout_setup(char *str) } __setup("deferred_probe_timeout=", deferred_probe_timeout_setup); +/** + * driver_deferred_probe_check_state() - Check deferred probe state + * @dev: device to check + * + * Return: + * * -ENODEV if initcalls have completed and modules are disabled. + * * -ETIMEDOUT if the deferred probe timeout was set and has expired + * and modules are enabled. + * * -EPROBE_DEFER in other cases. + * + * Drivers or subsystems can opt-in to calling this function instead of directly + * returning -EPROBE_DEFER. + */ +int driver_deferred_probe_check_state(struct device *dev) +{ + if (!IS_ENABLED(CONFIG_MODULES) && initcalls_done) { + dev_warn(dev, "ignoring dependency for device, assuming no driver\n"); + return -ENODEV; + } + + if (!driver_deferred_probe_timeout && initcalls_done) { + dev_warn(dev, "deferred probe timeout, ignoring dependency\n"); + return -ETIMEDOUT; + } + + return -EPROBE_DEFER; +} +EXPORT_SYMBOL_GPL(driver_deferred_probe_check_state); + static void deferred_probe_timeout_work_func(struct work_struct *work) { struct device_private *p; fw_devlink_drivers_done(); + driver_deferred_probe_timeout = 0; driver_deferred_probe_trigger(); flush_work(&deferred_probe_work); diff --git a/include/linux/device/driver.h b/include/linux/device/driver.h index 7acaabde5396..2114d65b862f 100644 --- a/include/linux/device/driver.h +++ b/include/linux/device/driver.h @@ -242,6 +242,7 @@ driver_find_device_by_acpi_dev(struct device_driver *drv, const void *adev) extern int driver_deferred_probe_timeout; void driver_deferred_probe_add(struct device *dev); +int driver_deferred_probe_check_state(struct device *dev); void driver_init(void); /**