Commit 7bf693951a8e5f7e600a45b74d91d962a453146e

Authored by Fabio M. Di Nitto
Committed by Linus Torvalds
1 parent 26297607e0

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>

Showing 2 changed files with 21 additions and 1 deletions Side-by-side Diff

Documentation/kernel-parameters.txt
... ... @@ -872,6 +872,12 @@
872 872 If specified, z/VM IUCV HVC accepts connections
873 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 881 i2c_bus= [HW] Override the default board specific I2C bus speed
876 882 or register an additional I2C bus that is not
877 883 registered from board initialization code.
... ... @@ -1316,6 +1316,18 @@
1316 1316 }
1317 1317 EXPORT_SYMBOL(console_start);
1318 1318  
  1319 +static int __read_mostly keep_bootcon;
  1320 +
  1321 +static 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 +
  1329 +early_param("keep_bootcon", keep_bootcon_setup);
  1330 +
1319 1331 /*
1320 1332 * The console driver calls this routine during kernel initialization
1321 1333 * to register the console printing procedure with printk() and to
... ... @@ -1463,7 +1475,9 @@
1463 1475 * users know there might be something in the kernel's log buffer that
1464 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 1481 /* we need to iterate through twice, to make sure we print
1468 1482 * everything out, before we unregister the console(s)
1469 1483 */