Messages in this thread Patch in this message | | | From | Feng Tang <> | Subject | [RFC PATCH] async: Add cmdline option to specify drivers to be async probed | Date | Fri, 25 Jan 2019 21:20:16 +0800 |
| |
Asynchronous driver probing can help much on kerenl fastboot, and this option can provide a flexible way to optimize and quickly verify async driver probe.
Also it will help in below cases: * Some driver actually covers several family of HWs, some of which could use async probling while others don't. So we can't simply turn on the PROBE_PREFER_ASYNCHRONOUS flag in driver, but use this cmdline option, like igb driver discussed at https://www.spinics.net/lists/netdev/msg545986.html
* For SOC (System on Chip) with multiple spi or i2c controllers, most of the slave spi/i2c devices will be assigned with fixed controller number, which prevents these spi/i2c controller drivers to be async probed. For plaforms not using these spi/i2c slave devices, they can use this cmdline option to benefit from the async probing.
Suggested-by: Alexander Duyck <alexander.duyck@gmail.com> Signed-off-by: Feng Tang <feng.tang@intel.com> --- drivers/base/dd.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 8ac10af..1f257561 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -57,6 +57,10 @@ static atomic_t deferred_trigger_count = ATOMIC_INIT(0); static struct dentry *deferred_devices; static bool initcalls_done; +/* Save the async probe drivers' name from kernel cmdline */ +#define ASYNC_DRV_NAMES_MAX_LEN 256 +static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN]; + /* * In some cases, like suspend to RAM or hibernation, It might be reasonable * to prohibit probing of devices as it could be unsafe. @@ -674,8 +678,26 @@ int driver_probe_device(struct device_driver *drv, struct device *dev) return ret; } +static inline bool cmdline_requested_async_probing(const char *drv_name) +{ + return parse_option_str(async_probe_drv_names, drv_name); +} + +static int __init save_async_options(char *buf) +{ + if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN) + printk(KERN_WARNING "Too long list for async_probe_drv_names!"); + + strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN - 1); + return 0; +} +__setup("driver_async_probe=", save_async_options); + bool driver_allows_async_probing(struct device_driver *drv) { + if (unlikely(cmdline_requested_async_probing(drv->name))) + return true; + switch (drv->probe_type) { case PROBE_PREFER_ASYNCHRONOUS: return true; -- 2.7.4
| |