aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio M. Di Nitto <fdinitto@redhat.com>2011-03-22 19:34:20 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-22 20:44:12 -0400
commit7bf693951a8e5f7e600a45b74d91d962a453146e (patch)
treed322e17d0d6b445d8332e210e01d3cce7ddfe5ca
parent26297607e09ca6c7e6f2a6b86a8bee2f23503bb8 (diff)
console: allow to retain boot console via boot option keep_bootcon
On some architectures, the boot process involves de-registering the boot console (early boot), initialize drivers and then re-register the console. This mechanism introduces a window in which no printk can happen on the console and messages are buffered and then printed once the new console is available. If a kernel crashes during this window, all it's left on the boot console is "console [foo] enabled, bootconsole disabled" making debug of the crash rather 'interesting'. By adding "keep_bootcon" option, do not unregister the boot console, that will allow to printk everything that is happening up to the crash. The option is clearly meant only for debugging purposes as it introduces lots of duplicated info printed on console, but will make bug report from users easier as it doesn't require a kernel build just to figure out where we crash. Signed-off-by: Fabio M. Di Nitto <fabbione@fabbione.net> Acked-by: David S. Miller <davem@davemloft.net> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Greg KH <gregkh@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--Documentation/kernel-parameters.txt6
-rw-r--r--kernel/printk.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index e9261e938f6a..c357a31411cd 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -872,6 +872,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
872 If specified, z/VM IUCV HVC accepts connections 872 If specified, z/VM IUCV HVC accepts connections
873 from listed z/VM user IDs only. 873 from listed z/VM user IDs only.
874 874
875 keep_bootcon [KNL]
876 Do not unregister boot console at start. This is only
877 useful for debugging when something happens in the window
878 between unregistering the boot console and initializing
879 the real console.
880
875 i2c_bus= [HW] Override the default board specific I2C bus speed 881 i2c_bus= [HW] Override the default board specific I2C bus speed
876 or register an additional I2C bus that is not 882 or register an additional I2C bus that is not
877 registered from board initialization code. 883 registered from board initialization code.
diff --git a/kernel/printk.c b/kernel/printk.c
index 33284adb2189..2b591f252e55 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -1316,6 +1316,18 @@ void console_start(struct console *console)
1316} 1316}
1317EXPORT_SYMBOL(console_start); 1317EXPORT_SYMBOL(console_start);
1318 1318
1319static int __read_mostly keep_bootcon;
1320
1321static int __init keep_bootcon_setup(char *str)
1322{
1323 keep_bootcon = 1;
1324 printk(KERN_INFO "debug: skip boot console de-registration.\n");
1325
1326 return 0;
1327}
1328
1329early_param("keep_bootcon", keep_bootcon_setup);
1330
1319/* 1331/*
1320 * The console driver calls this routine during kernel initialization 1332 * The console driver calls this routine during kernel initialization
1321 * to register the console printing procedure with printk() and to 1333 * to register the console printing procedure with printk() and to
@@ -1463,7 +1475,9 @@ void register_console(struct console *newcon)
1463 * users know there might be something in the kernel's log buffer that 1475 * users know there might be something in the kernel's log buffer that
1464 * went to the bootconsole (that they do not see on the real console) 1476 * went to the bootconsole (that they do not see on the real console)
1465 */ 1477 */
1466 if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { 1478 if (bcon &&
1479 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
1480 !keep_bootcon) {
1467 /* we need to iterate through twice, to make sure we print 1481 /* we need to iterate through twice, to make sure we print
1468 * everything out, before we unregister the console(s) 1482 * everything out, before we unregister the console(s)
1469 */ 1483 */