diff options
Diffstat (limited to 'kernel/printk.c')
| -rw-r--r-- | kernel/printk.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 41fe60995530..668df351e6a9 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -1240,22 +1240,14 @@ void register_console(struct console *newcon) | |||
| 1240 | if (!(newcon->flags & CON_ENABLED)) | 1240 | if (!(newcon->flags & CON_ENABLED)) |
| 1241 | return; | 1241 | return; |
| 1242 | 1242 | ||
| 1243 | if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { | 1243 | /* |
| 1244 | /* we need to iterate through twice, to make sure we print | 1244 | * If we have a bootconsole, and are switching to a real console, |
| 1245 | * everything out, before we unregister the console(s) | 1245 | * don't print everything out again, since when the boot console, and |
| 1246 | */ | 1246 | * the real console are the same physical device, it's annoying to |
| 1247 | printk(KERN_INFO "console handover:"); | 1247 | * see the beginning boot messages twice |
| 1248 | for_each_console(bcon) | 1248 | */ |
| 1249 | printk("boot [%s%d] ", bcon->name, bcon->index); | 1249 | if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) |
| 1250 | printk(" -> real [%s%d]\n", newcon->name, newcon->index); | ||
| 1251 | for_each_console(bcon) | ||
| 1252 | unregister_console(bcon); | ||
| 1253 | newcon->flags &= ~CON_PRINTBUFFER; | 1250 | newcon->flags &= ~CON_PRINTBUFFER; |
| 1254 | } else { | ||
| 1255 | printk(KERN_INFO "%sconsole [%s%d] enabled\n", | ||
| 1256 | (newcon->flags & CON_BOOT) ? "boot" : "" , | ||
| 1257 | newcon->name, newcon->index); | ||
| 1258 | } | ||
| 1259 | 1251 | ||
| 1260 | /* | 1252 | /* |
| 1261 | * Put this console in the list - keep the | 1253 | * Put this console in the list - keep the |
| @@ -1281,6 +1273,28 @@ void register_console(struct console *newcon) | |||
| 1281 | spin_unlock_irqrestore(&logbuf_lock, flags); | 1273 | spin_unlock_irqrestore(&logbuf_lock, flags); |
| 1282 | } | 1274 | } |
| 1283 | release_console_sem(); | 1275 | release_console_sem(); |
| 1276 | |||
| 1277 | /* | ||
| 1278 | * By unregistering the bootconsoles after we enable the real console | ||
| 1279 | * we get the "console xxx enabled" message on all the consoles - | ||
| 1280 | * boot consoles, real consoles, etc - this is to ensure that end | ||
| 1281 | * users know there might be something in the kernel's log buffer that | ||
| 1282 | * went to the bootconsole (that they do not see on the real console) | ||
| 1283 | */ | ||
| 1284 | if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { | ||
| 1285 | /* we need to iterate through twice, to make sure we print | ||
| 1286 | * everything out, before we unregister the console(s) | ||
| 1287 | */ | ||
| 1288 | printk(KERN_INFO "console [%s%d] enabled, bootconsole disabled\n", | ||
| 1289 | newcon->name, newcon->index); | ||
| 1290 | for_each_console(bcon) | ||
| 1291 | if (bcon->flags & CON_BOOT) | ||
| 1292 | unregister_console(bcon); | ||
| 1293 | } else { | ||
| 1294 | printk(KERN_INFO "%sconsole [%s%d] enabled\n", | ||
| 1295 | (newcon->flags & CON_BOOT) ? "boot" : "" , | ||
| 1296 | newcon->name, newcon->index); | ||
| 1297 | } | ||
| 1284 | } | 1298 | } |
| 1285 | EXPORT_SYMBOL(register_console); | 1299 | EXPORT_SYMBOL(register_console); |
| 1286 | 1300 | ||
