diff options
Diffstat (limited to 'debian/patches-rt/0007-printk-Properly-deal-with-nbcon-consoles-on-seq-init.patch')
-rw-r--r-- | debian/patches-rt/0007-printk-Properly-deal-with-nbcon-consoles-on-seq-init.patch | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/debian/patches-rt/0007-printk-Properly-deal-with-nbcon-consoles-on-seq-init.patch b/debian/patches-rt/0007-printk-Properly-deal-with-nbcon-consoles-on-seq-init.patch new file mode 100644 index 0000000000..cc54d0652e --- /dev/null +++ b/debian/patches-rt/0007-printk-Properly-deal-with-nbcon-consoles-on-seq-init.patch @@ -0,0 +1,116 @@ +From: John Ogness <john.ogness@linutronix.de> +Date: Wed, 22 Nov 2023 11:23:43 +0000 +Subject: [PATCH 07/48] printk: Properly deal with nbcon consoles on seq init +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patches-6.8.2-rt11.tar.xz + +If a non-boot console is registering and boot consoles exist, the +consoles are flushed before being unregistered. This allows the +non-boot console to continue where the boot console left off. + +If for whatever reason flushing fails, the lowest seq found from +any of the enabled boot consoles is used. Until now con->seq was +checked. However, if it is an nbcon boot console, the function +nbcon_seq_read() must be used to read seq because con->seq is +not updated for nbcon consoles. + +Check if it is an nbcon boot console and if so call +nbcon_seq_read() to read seq. + +Also setup the nbcon sequence number and reset the legacy +sequence number from register_console() (rather than in +nbcon_init() and nbcon_seq_force()). This removes all legacy +sequence handling from nbcon.c so the code is easier to follow +and maintain. + +Signed-off-by: John Ogness <john.ogness@linutronix.de> +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + kernel/printk/nbcon.c | 7 +------ + kernel/printk/printk.c | 29 ++++++++++++++++++++++++----- + 2 files changed, 25 insertions(+), 11 deletions(-) + +--- a/kernel/printk/nbcon.c ++++ b/kernel/printk/nbcon.c +@@ -172,9 +172,6 @@ void nbcon_seq_force(struct console *con + u64 valid_seq = max_t(u64, seq, prb_first_valid_seq(prb)); + + atomic_long_set(&ACCESS_PRIVATE(con, nbcon_seq), __u64seq_to_ulseq(valid_seq)); +- +- /* Clear con->seq since nbcon consoles use con->nbcon_seq instead. */ +- con->seq = 0; + } + + /** +@@ -964,8 +961,6 @@ bool nbcon_alloc(struct console *con) + * + * nbcon_alloc() *must* be called and succeed before this function + * is called. +- * +- * This function expects that the legacy @con->seq has been set. + */ + void nbcon_init(struct console *con) + { +@@ -974,7 +969,7 @@ void nbcon_init(struct console *con) + /* nbcon_alloc() must have been called and successful! */ + BUG_ON(!con->pbufs); + +- nbcon_seq_force(con, con->seq); ++ nbcon_seq_force(con, 0); + nbcon_state_set(con, &state); + } + +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -3353,6 +3353,7 @@ static void try_enable_default_console(s + newcon->flags |= CON_CONSDEV; + } + ++/* Set @newcon->seq to the first record this console should print. */ + static void console_init_seq(struct console *newcon, bool bootcon_registered) + { + struct console *con; +@@ -3401,11 +3402,20 @@ static void console_init_seq(struct cons + + newcon->seq = prb_next_seq(prb); + for_each_console(con) { +- if ((con->flags & CON_BOOT) && +- (con->flags & CON_ENABLED) && +- con->seq < newcon->seq) { +- newcon->seq = con->seq; ++ u64 seq; ++ ++ if (!((con->flags & CON_BOOT) && ++ (con->flags & CON_ENABLED))) { ++ continue; + } ++ ++ if (con->flags & CON_NBCON) ++ seq = nbcon_seq_read(con); ++ else ++ seq = con->seq; ++ ++ if (seq < newcon->seq) ++ newcon->seq = seq; + } + } + +@@ -3522,9 +3532,18 @@ void register_console(struct console *ne + newcon->dropped = 0; + console_init_seq(newcon, bootcon_registered); + +- if (newcon->flags & CON_NBCON) ++ if (newcon->flags & CON_NBCON) { + nbcon_init(newcon); + ++ /* ++ * nbcon consoles have their own sequence counter. The legacy ++ * sequence counter is reset so that it is clear it is not ++ * being used. ++ */ ++ nbcon_seq_force(newcon, newcon->seq); ++ newcon->seq = 0; ++ } ++ + /* + * Put this console in the list - keep the + * preferred driver at the head of the list. |