With a large number of processors in a system there is an excessive amount of messages sent to the system console. It's estimated that with 4096 processors in a system, and the console baudrate set to 56K, the startup messages will take about 84 minutes to clear the serial port. This patch adds (for SGI UV only) a kernel start option "limit_console_ output" (or 'lco' for short), which when set provides the ability to temporarily reduce the console loglevel during system startup. This allows informative messages to still be seen on the console without producing excessive amounts of repetious messages. Note that all the messages are still available in the kernel log buffer. Cc: Randy Dunlap Cc: Steven Rostedt Cc: Greg Kroah-Hartman Cc: Frederic Weisbecker Cc: Heiko Carstens Cc: Robin Getz Cc: Dave Young Cc: linux-kernel@vger.kernel.org Cc: linux-doc@vger.kernel.org Signed-off-by: Mike Travis --- Documentation/kernel-parameters.txt | 6 ++++ include/linux/kernel.h | 23 +++++++++++++++++ kernel/printk.c | 47 ++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) --- linux.orig/Documentation/kernel-parameters.txt +++ linux/Documentation/kernel-parameters.txt @@ -103,6 +103,7 @@ UMS USB Mass Storage support is enabled. USB USB support is enabled. USBHID USB Human Interface Device support is enabled. + UV SGI Ultraviolet V4L Video For Linux support is enabled. VGA The VGA console has been enabled. VT Virtual terminal support is enabled. @@ -1218,6 +1219,11 @@ If there are multiple matching configurations changing the same attribute, the last one is used. + limit_console_output [UV] + lco [UV] + Limits repetitous messages when the number of cpus in + a system is large. + lmb=debug [KNL] Enable lmb debug messages. load_ramdisk= [RAM] List of ramdisks to load from floppy --- linux.orig/include/linux/kernel.h +++ linux/include/linux/kernel.h @@ -372,6 +372,29 @@ } #endif +#ifdef CONFIG_X86_UV +bool _limit_console_output(bool suspend); +#define limit_console_output(suspend) \ +({ \ + bool limit = _limit_console_output(suspend); \ + if (limit) \ + printk_once(KERN_NOTICE \ + "printk: further related messages suppressed\n");\ + limit; \ +}) + +void end_limit_console_output(void); +#else +static inline bool limit_console_output(bool suspend) +{ + return false; +} + +static inline void end_limit_console_output(void) +{ +} +#endif + extern int printk_needs_cpu(int cpu); extern void printk_tick(void); --- linux.orig/kernel/printk.c +++ linux/kernel/printk.c @@ -1417,3 +1417,50 @@ } EXPORT_SYMBOL(printk_timed_ratelimit); #endif + +#ifdef CONFIG_X86_UV +/* + * Support to suppress the zillions of extra messages being sent to + * the console when a server has a large number of cpus. + */ +static bool __read_mostly console_output_limited; +static int __init limit_console_output_setup(char *str) +{ + console_output_limited = true; + printk(KERN_NOTICE "printk: console messages will be limited.\n"); + return 0; +} +early_param("limit_console_output", limit_console_output_setup); + +static int __init lco(char *str) +{ + return limit_console_output_setup(str); +} +early_param("lco", lco); + +#define SUSPENDED_CONSOLE_LOGLEVEL (DEFAULT_CONSOLE_LOGLEVEL-1) + +/* check if "limiting" console output and suspend further msgs if requested. */ +bool _limit_console_output(bool suspend) +{ + if (console_output_limited) { + if (suspend && saved_console_loglevel == -1) { + saved_console_loglevel = console_loglevel; + console_loglevel = SUSPENDED_CONSOLE_LOGLEVEL; + } + return true; + } + return false; +} +EXPORT_SYMBOL(_limit_console_output); + +/* remove suspension of console msgs. */ +void end_limit_console_output(void) +{ + if (console_output_limited && saved_console_loglevel != -1) { + console_loglevel = saved_console_loglevel; + saved_console_loglevel = -1; + } +} +EXPORT_SYMBOL(end_limit_console_output); +#endif -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/