Skip to content

Commit

Permalink
printk: Track registered boot consoles
Browse files Browse the repository at this point in the history
Unfortunately it is not known if a boot console and a regular
(legacy or nbcon) console use the same hardware. For this reason
they must not be allowed to print simultaneously.

For legacy consoles this is not an issue because they are
already synchronized with the boot consoles using the console
lock. However nbcon consoles can be triggered separately.

Add a global flag @have_boot_console to identify if any boot
consoles are registered. This will be used in follow-up commits
to ensure that boot consoles and nbcon consoles cannot print
simultaneously.

Signed-off-by: John Ogness <[email protected]>
Reviewed-by: Petr Mladek <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Petr Mladek <[email protected]>
  • Loading branch information
jogness authored and pmladek committed Aug 21, 2024
1 parent d3a9f82 commit 97ea9bc
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions kernel/printk/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,14 @@ static int console_msg_format = MSG_FORMAT_DEFAULT;
/* syslog_lock protects syslog_* variables and write access to clear_seq. */
static DEFINE_MUTEX(syslog_lock);

/*
* Specifies if a boot console is registered. If boot consoles are present,
* nbcon consoles cannot print simultaneously and must be synchronized by
* the console lock. This is because boot consoles and nbcon consoles may
* have mapped the same hardware.
*/
static bool have_boot_console;

#ifdef CONFIG_PRINTK
DECLARE_WAIT_QUEUE_HEAD(log_wait);
/* All 3 protected by @syslog_lock. */
Expand Down Expand Up @@ -3610,6 +3618,9 @@ void register_console(struct console *newcon)
newcon->seq = init_seq;
}

if (newcon->flags & CON_BOOT)
have_boot_console = true;

/*
* If another context is actively using the hardware of this new
* console, it will not be aware of the nbcon synchronization. This
Expand Down Expand Up @@ -3680,7 +3691,9 @@ EXPORT_SYMBOL(register_console);
static int unregister_console_locked(struct console *console)
{
bool use_device_lock = (console->flags & CON_NBCON) && console->write_atomic;
bool found_boot_con = false;
unsigned long flags;
struct console *c;
int res;

lockdep_assert_console_list_lock_held();
Expand Down Expand Up @@ -3738,6 +3751,17 @@ static int unregister_console_locked(struct console *console)
if (console->exit)
res = console->exit(console);

/*
* With this console gone, the global flags tracking registered
* console types may have changed. Update them.
*/
for_each_console(c) {
if (c->flags & CON_BOOT)
found_boot_con = true;
}
if (!found_boot_con)
have_boot_console = found_boot_con;

return res;
}

Expand Down

0 comments on commit 97ea9bc

Please sign in to comment.