Added a new config option to allow offloading individual calls to try_smi_init(). Saves 100ms on my system.
Signed-off-by: Michal Clapinski <[email protected]> --- v2: - instead of offloading the whole init function, offload just the individual calls to try_smi_init() I didn't implement the periodic retry feature that was talked about under v1 due to my lack of expertise. LMK if this is a deal-breaker. --- drivers/char/ipmi/Kconfig | 9 +++++++++ drivers/char/ipmi/ipmi_si_intf.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/drivers/char/ipmi/Kconfig b/drivers/char/ipmi/Kconfig index 669f76000197..c8fa445c1c17 100644 --- a/drivers/char/ipmi/Kconfig +++ b/drivers/char/ipmi/Kconfig @@ -67,6 +67,15 @@ config IPMI_SI Currently, only KCS and SMIC are supported. If you are using IPMI, you should probably say "y" here. +config IPMI_SI_ASYNC_INIT + bool 'Asynchronous initialization of IPMI System Interface' + depends on IPMI_SI + default n + help + Offloads invidual SMI inits. It speeds up the boot time. + It also introduces a very small risk that something else might fail + if it depends on synchronous IPMI init. + config IPMI_SSIF tristate 'IPMI SMBus handler (SSIF)' depends on I2C diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 9a9d12be9bf7..504d5b8636ba 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -39,6 +39,7 @@ #include <linux/rcupdate.h> #include <linux/ipmi.h> #include <linux/ipmi_smi.h> +#include <linux/async.h> #include "ipmi_si.h" #include "ipmi_si_sm.h" #include <linux/string.h> @@ -2174,6 +2175,17 @@ static bool __init ipmi_smi_info_same(struct smi_info *e1, struct smi_info *e2) e1->io.addr_data == e2->io.addr_data); } +static ASYNC_DOMAIN_EXCLUSIVE(ipmi_si_async_domain); + +static void __init async_try_smi_init(void *data, async_cookie_t cookie) +{ + struct smi_info *smi = data; + + mutex_lock(&smi_infos_lock); + try_smi_init(smi); + mutex_unlock(&smi_infos_lock); +} + static int __init init_ipmi_si(void) { struct smi_info *e, *e2; @@ -2219,8 +2231,13 @@ static int __init init_ipmi_si(void) break; } } - if (!dup) - try_smi_init(e); + if (!dup) { + if (IS_ENABLED(CONFIG_IPMI_SI_ASYNC_INIT)) + async_schedule_domain(async_try_smi_init, e, + &ipmi_si_async_domain); + else + try_smi_init(e); + } } /* @@ -2253,8 +2270,13 @@ static int __init init_ipmi_si(void) break; } } - if (!dup) - try_smi_init(e); + if (!dup) { + if (IS_ENABLED(CONFIG_IPMI_SI_ASYNC_INIT)) + async_schedule_domain(async_try_smi_init, e, + &ipmi_si_async_domain); + else + try_smi_init(e); + } } initialized = true; @@ -2401,6 +2423,8 @@ static void cleanup_ipmi_si(void) if (!initialized) return; + async_synchronize_full_domain(&ipmi_si_async_domain); + ipmi_si_pci_shutdown(); ipmi_si_ls2k_shutdown(); -- 2.55.0.795.g602f6c329a-goog _______________________________________________ Openipmi-developer mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openipmi-developer
