[PATCH v3 4/6] printk: deprecate boot_delay in favour of printk_delay
Andrew Murray <[email protected]>
| Newsgroups | dev.linux.lists.linux-rt-devel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The boot_delay (BOOT_PRINTK_DELAY) kernel parameter and printk_delay sysctl are two distinct mechanisms for providing similar functionality which add a delay prior to each printed printk message. boot_delay provides a kernel parameter for delaying printk output from kernel start through to boot (SYSTEM_RUNNING), whereas printk_delay is configurable only via sysctl and thus is only used post boot. Let's deprecate the boot_delay feature in favour of printk_delay. In order to preserve functionality, we'll also extend printk_delay such that it can additionally configured via an early kernel parameter. Behavior change: The delay enabled by both "boot_delay" and "printk_delay" continues working even in SYSTEM_RUNNING state. It must be explicitly stopped by setting printk_delay=0 via sysctl. The delay is skipped when the message is suppressed in all system states. It used to skipped only for the boot_delay. Signed-off-by: Andrew Murray <[email protected]> --- kernel/printk/printk.c | 81 +++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 28e6dff2faa7d4294c1b2ebe2844ce5d4dc0e05a..4517266e9ca112e0dcb0163a99dd0e8d50931848 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1291,43 +1291,28 @@ static bool suppress_message_printing(int level) #ifdef CONFIG_GENERIC_CALIBRATE_DELAY -static unsigned int boot_delay; /* msecs delay after each printk during bootup */ static unsigned long long loops_per_msec; /* based on boot_delay */ -static int __init boot_delay_setup(char *str) +static void __init printk_delay_calculate(void) { unsigned long lpj; - int boot_delay_val; lpj = preset_lpj ? preset_lpj : 1000000; /* some guess */ loops_per_msec = (unsigned long long)lpj / 1000 * HZ; - get_option(&str, &boot_delay_val); - if (boot_delay_val < 0 || boot_delay_val > 10 * 1000) - return 0; - - boot_delay = (unsigned int)boot_delay_val; - - pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, " + pr_debug("printk_delay: %u, preset_lpj: %ld, lpj: %lu, " "HZ: %d, loops_per_msec: %llu\n", - boot_delay, preset_lpj, lpj, HZ, loops_per_msec); - return 0; + printk_delay_msec, preset_lpj, lpj, HZ, loops_per_msec); } -early_param("boot_delay", boot_delay_setup); -static void boot_delay_msec(int level) +static void early_boot_delay_msec(void) { unsigned long long k; unsigned long timeout; - bool suppress = !is_printk_force_console() && - suppress_message_printing(level); - - if ((boot_delay == 0 || system_state >= SYSTEM_RUNNING) || suppress) - return; - k = (unsigned long long)loops_per_msec * boot_delay; + k = (unsigned long long)loops_per_msec * printk_delay_msec; - timeout = jiffies + msecs_to_jiffies(boot_delay); + timeout = jiffies + msecs_to_jiffies(printk_delay_msec); while (k) { k--; cpu_relax(); @@ -1342,11 +1327,37 @@ static void boot_delay_msec(int level) } } #else -static inline void boot_delay_msec(int level) +static inline void __init printk_delay_calculate(void) +{ +} + +static inline void early_boot_delay_msec(void) { } #endif +static int __init printk_delay_setup(char *str) +{ + int printk_delay_val = 0; + + get_option(&str, &printk_delay_val); + if (printk_delay_val < 0 || printk_delay_val > 10 * 1000) + return 0; + + printk_delay_msec = (unsigned int)printk_delay_val; + printk_delay_calculate(); + + return 0; +} +early_param("printk_delay", printk_delay_setup); + +static int __init boot_delay_setup(char *str) +{ + pr_warn("boot_delay will soon be deprecated, please use printk_delay instead\n"); + return printk_delay_setup(str); +} +early_param("boot_delay", boot_delay_setup); + static bool printk_time = IS_ENABLED(CONFIG_PRINTK_TIME); module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR); @@ -2122,18 +2133,28 @@ static u8 *__printk_recursion_counter(void) unsigned int printk_delay_msec __read_mostly; +static inline void late_boot_delay_msec(void) +{ + unsigned int m = printk_delay_msec; + + while (m--) { + mdelay(1); + touch_nmi_watchdog(); + } +} + static inline void printk_delay(int level) { - boot_delay_msec(level); + bool suppress = !is_printk_force_console() && + suppress_message_printing(level); - if (unlikely(printk_delay_msec)) { - unsigned int m = printk_delay_msec; + if (likely(!printk_delay_msec) || suppress) + return; - while (m--) { - mdelay(1); - touch_nmi_watchdog(); - } - } + if (system_state < SYSTEM_RUNNING) + early_boot_delay_msec(); + else + late_boot_delay_msec(); } #define CALLER_ID_MASK 0x80000000 -- 2.34.1