diff options
| author | Petr Mladek <pmladek@suse.com> | 2026-10-22 10:22:29 +0200 |
|---|---|---|
| committer | Petr Mladek <pmladek@suse.com> | 2026-10-22 10:22:29 +0200 |
| commit | 111153e8280b4fa8b5537c941264ee6dc71d71d8 (patch) | |
| tree | 099a9518d9704cdfb84c261fba234f7042381e59 | |
| parent | 046d687e58ed60d917f91b348f70125acc345088 (diff) | |
| parent | 2dd7ee9638a0d9d94a574c60f221da00514e6146 (diff) | |
Merge branch 'for-7.4-console-registration' into for-linus
| -rw-r--r-- | kernel/printk/printk.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index fa0f711d586e..9a205f94bfac 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -4426,36 +4426,51 @@ void __init console_init(void) * be a brief interval in which no messages are logged to the console, which * makes it difficult to diagnose problems that occur during this time. * - * To mitigate this problem somewhat, only unregister consoles whose memory - * intersects with the init section. Note that all other boot consoles will - * get unregistered when the real preferred console is registered. + * If a real console has already registered, remove all remaining boot consoles. + * Otherwise, mitigate the no-console interval by removing only boot consoles + * whose memory intersects with the init section. */ static int __init printk_late_init(void) { + bool have_real_console = false; struct hlist_node *tmp; struct console *con; int ret; console_list_lock(); + for_each_console(con) { + if (!(con->flags & CON_BOOT)) { + have_real_console = true; + break; + } + } + hlist_for_each_entry_safe(con, tmp, &console_list, node) { if (!(con->flags & CON_BOOT)) continue; - /* Check addresses that might be used for enabled consoles. */ - if (init_section_intersects(con, sizeof(*con)) || - init_section_contains(con->write, 0) || - init_section_contains(con->read, 0) || - init_section_contains(con->device, 0) || - init_section_contains(con->unblank, 0) || - init_section_contains(con->data, 0)) { + /* + * Keep the boot console when requested or as a fallback + * unless it is using an init section. + */ + if (keep_bootcon || !have_real_console) { + if (!init_section_intersects(con, sizeof(*con)) && + !init_section_contains(con->write, 0) && + !init_section_contains(con->read, 0) && + !init_section_contains(con->device, 0) && + !init_section_contains(con->unblank, 0) && + !init_section_contains(con->data, 0)) + continue; + /* * Please, consider moving the reported consoles out * of the init section. */ pr_warn("bootconsole [%s%d] uses init memory and must be disabled even before the real one is ready\n", con->name, con->index); - unregister_console_locked(con); } + + unregister_console_locked(con); } console_list_unlock(); |
