aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/dd.c
diff options
context:
space:
mode:
authorFeng Tang <feng.tang@intel.com>2019-02-13 02:47:36 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-02-14 04:51:39 -0500
commit1ea61b68d0f8685775c897c2de040c73b8d1c56a (patch)
treedb5267e71273bd1ed8d011593b29ff07215876bd /drivers/base/dd.c
parent4c06c4e6cf63d7f3d5dfe62593a073253d750a59 (diff)
async: Add cmdline option to specify drivers to be async probed
Asynchronous driver probing can help much on kernel 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 families of HWs, some of which could use async probing 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 async patch 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, while async probing may make those controllers get different index for each boot, which prevents those controller drivers to be async probed. For platforms not using these spi/i2c slave devices, they can use this cmdline option to benefit from the async probing. Suggested-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Feng Tang <feng.tang@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r--drivers/base/dd.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 348fc4695d4d..a823f469e53f 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -57,6 +57,10 @@ static atomic_t deferred_trigger_count = ATOMIC_INIT(0);
57static struct dentry *deferred_devices; 57static struct dentry *deferred_devices;
58static bool initcalls_done; 58static bool initcalls_done;
59 59
60/* Save the async probe drivers' name from kernel cmdline */
61#define ASYNC_DRV_NAMES_MAX_LEN 256
62static char async_probe_drv_names[ASYNC_DRV_NAMES_MAX_LEN];
63
60/* 64/*
61 * In some cases, like suspend to RAM or hibernation, It might be reasonable 65 * In some cases, like suspend to RAM or hibernation, It might be reasonable
62 * to prohibit probing of devices as it could be unsafe. 66 * to prohibit probing of devices as it could be unsafe.
@@ -674,6 +678,23 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
674 return ret; 678 return ret;
675} 679}
676 680
681static inline bool cmdline_requested_async_probing(const char *drv_name)
682{
683 return parse_option_str(async_probe_drv_names, drv_name);
684}
685
686/* The option format is "driver_async_probe=drv_name1,drv_name2,..." */
687static int __init save_async_options(char *buf)
688{
689 if (strlen(buf) >= ASYNC_DRV_NAMES_MAX_LEN)
690 printk(KERN_WARNING
691 "Too long list of driver names for 'driver_async_probe'!\n");
692
693 strlcpy(async_probe_drv_names, buf, ASYNC_DRV_NAMES_MAX_LEN);
694 return 0;
695}
696__setup("driver_async_probe=", save_async_options);
697
677bool driver_allows_async_probing(struct device_driver *drv) 698bool driver_allows_async_probing(struct device_driver *drv)
678{ 699{
679 switch (drv->probe_type) { 700 switch (drv->probe_type) {
@@ -684,6 +705,9 @@ bool driver_allows_async_probing(struct device_driver *drv)
684 return false; 705 return false;
685 706
686 default: 707 default:
708 if (cmdline_requested_async_probing(drv->name))
709 return true;
710
687 if (module_requested_async_probing(drv->owner)) 711 if (module_requested_async_probing(drv->owner))
688 return true; 712 return true;
689 713