diff --git a/init/Kconfig b/init/Kconfig index a4fa7858f0d8..4c3551545289 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -608,6 +608,16 @@ config LOG_BUF_SHIFT 13 => 8 KB 12 => 4 KB +config CONSOLE_FLUSH_ON_HOTPLUG + bool "Enable console flush configurable in hot plug code path" + depends on HOTPLUG_CPU + def_bool n + help + In cpu hot plug path console lock acquire and release causes the + console to flush. If console lock is not free hot plug latency + increases. So make console flush configurable in hot plug path + and default disabled to help in cpu hot plug latencies. + config LOG_CPU_MAX_BUF_SHIFT int "CPU kernel log buffer size contribution (13 => 8 KB, 17 => 128KB)" depends on SMP diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 1888f6a3b694..0b1c9553d48f 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -2245,6 +2245,8 @@ void resume_console(void) console_unlock(); } +#ifdef CONFIG_CONSOLE_FLUSH_ON_HOTPLUG + /** * console_cpu_notify - print deferred console messages after CPU hotplug * @cpu: unused @@ -2264,6 +2266,8 @@ static int console_cpu_notify(unsigned int cpu) return 0; } +#endif + /** * console_lock - lock the console system for exclusive use. * @@ -2894,7 +2898,7 @@ void __init console_init(void) static int __init printk_late_init(void) { struct console *con; - int ret; + int ret = 0; for_each_console(con) { if (!(con->flags & CON_BOOT)) @@ -2916,13 +2920,15 @@ static int __init printk_late_init(void) unregister_console(con); } } +#ifdef CONFIG_CONSOLE_FLUSH_ON_HOTPLUG ret = cpuhp_setup_state_nocalls(CPUHP_PRINTK_DEAD, "printk:dead", NULL, console_cpu_notify); WARN_ON(ret < 0); ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "printk:online", console_cpu_notify, NULL); WARN_ON(ret < 0); - return 0; +#endif + return ret; } late_initcall(printk_late_init);