From: John Ogness <john.ogness@linutronix.de>
To: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>,
Steven Rostedt <rostedt@goodmis.org>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH printk v4 11/17] printk: nbcon: Show replay message on takeover
Date: Tue, 27 Aug 2024 06:49:27 +0206 [thread overview]
Message-ID: <20240827044333.88596-12-john.ogness@linutronix.de> (raw)
In-Reply-To: <20240827044333.88596-1-john.ogness@linutronix.de>
An emergency or panic context can takeover console ownership
while the current owner was printing a printk message. The
atomic printer will re-print the message that the previous
owner was printing. However, this can look confusing to the
user and may even seem as though a message was lost.
[3430014.1
[3430014.181123] usb 1-2: Product: USB Audio
Add a new field @nbcon_prev_seq to struct console to track
the sequence number to print that was assigned to the previous
console owner. If this matches the sequence number to print
that the current owner is assigned, then a takeover must have
occurred. In this case, print an additional message to inform
the user that the previous message is being printed again.
[3430014.1
** replaying previous printk message **
[3430014.181123] usb 1-2: Product: USB Audio
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
---
include/linux/console.h | 2 ++
kernel/printk/internal.h | 1 +
kernel/printk/nbcon.c | 26 ++++++++++++++++++++++++++
kernel/printk/printk.c | 11 +++++++++++
4 files changed, 40 insertions(+)
diff --git a/include/linux/console.h b/include/linux/console.h
index 788ce9c829f6..eba367bf605d 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -325,6 +325,7 @@ struct nbcon_write_context {
* @nbcon_state: State for nbcon consoles
* @nbcon_seq: Sequence number of the next record for nbcon to print
* @nbcon_device_ctxt: Context available for non-printing operations
+ * @nbcon_prev_seq: Seq num the previous nbcon owner was assigned to print
* @pbufs: Pointer to nbcon private buffer
* @kthread: Printer kthread for this console
* @rcuwait: RCU-safe wait object for @kthread waking
@@ -459,6 +460,7 @@ struct console {
atomic_t __private nbcon_state;
atomic_long_t __private nbcon_seq;
struct nbcon_context __private nbcon_device_ctxt;
+ atomic_long_t __private nbcon_prev_seq;
struct printk_buffers *pbufs;
struct task_struct *kthread;
diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h
index 8166e24f8780..c365d25b13c7 100644
--- a/kernel/printk/internal.h
+++ b/kernel/printk/internal.h
@@ -319,4 +319,5 @@ bool printk_get_next_message(struct printk_message *pmsg, u64 seq,
#ifdef CONFIG_PRINTK
void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped);
+void console_prepend_replay(struct printk_message *pmsg);
#endif
diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c
index c36473fbbf89..d3a018919046 100644
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -946,7 +946,9 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt, bool use_a
.pbufs = ctxt->pbufs,
};
unsigned long con_dropped;
+ struct nbcon_state cur;
unsigned long dropped;
+ unsigned long ulseq;
/*
* This function should never be called for consoles that have not
@@ -987,6 +989,29 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt, bool use_a
if (dropped && !is_extended)
console_prepend_dropped(&pmsg, dropped);
+ /*
+ * If the previous owner was assigned the same record, this context
+ * has taken over ownership and is replaying the record. Prepend a
+ * message to let the user know the record is replayed.
+ */
+ ulseq = atomic_long_read(&ACCESS_PRIVATE(con, nbcon_prev_seq));
+ if (__ulseq_to_u64seq(prb, ulseq) == pmsg.seq) {
+ console_prepend_replay(&pmsg);
+ } else {
+ /*
+ * Ensure this context is still the owner before trying to
+ * update @nbcon_prev_seq. Otherwise the value in @ulseq may
+ * not be from the previous owner and instead be some later
+ * value from the context that took over ownership.
+ */
+ nbcon_state_read(con, &cur);
+ if (!nbcon_context_can_proceed(ctxt, &cur))
+ return false;
+
+ atomic_long_try_cmpxchg(&ACCESS_PRIVATE(con, nbcon_prev_seq), &ulseq,
+ __u64seq_to_ulseq(pmsg.seq));
+ }
+
if (!nbcon_context_exit_unsafe(ctxt))
return false;
@@ -1638,6 +1663,7 @@ bool nbcon_alloc(struct console *con)
rcuwait_init(&con->rcuwait);
init_irq_work(&con->irq_work, nbcon_irq_work);
+ atomic_long_set(&ACCESS_PRIVATE(con, nbcon_prev_seq), -1UL);
nbcon_state_set(con, &state);
/*
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index fba923730af9..8863519438f9 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2902,6 +2902,17 @@ void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped)
console_prepend_message(pmsg, "** %lu printk messages dropped **\n", dropped);
}
+/*
+ * Prepend the message in @pmsg->pbufs->outbuf with a "replay message".
+ * @pmsg->outbuf_len is updated appropriately.
+ *
+ * @pmsg is the printk message to prepend.
+ */
+void console_prepend_replay(struct printk_message *pmsg)
+{
+ console_prepend_message(pmsg, "** replaying previous printk message **\n");
+}
+
/*
* Read and format the specified record (or a later record if the specified
* record is not available).
--
2.39.2
next prev parent reply other threads:[~2024-08-27 4:43 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 4:43 [PATCH printk v4 00/17] add threaded printing + the rest John Ogness
2024-08-27 4:43 ` [PATCH printk v4 01/17] printk: nbcon: Add function for printers to reacquire ownership John Ogness
2024-08-27 11:57 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 02/17] printk: Fail pr_flush() if before SYSTEM_SCHEDULING John Ogness
2024-08-27 12:00 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 03/17] printk: Flush console on unregister_console() John Ogness
2024-08-27 4:43 ` [PATCH printk v4 04/17] printk: nbcon: Add context to usable() and emit() John Ogness
2024-08-27 12:21 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 05/17] printk: nbcon: Init @nbcon_seq to highest possible John Ogness
2024-08-27 12:29 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 06/17] printk: nbcon: Introduce printer kthreads John Ogness
2024-08-27 14:48 ` Petr Mladek
2024-08-28 17:33 ` John Ogness
2024-08-27 4:43 ` [PATCH printk v4 07/17] printk: nbcon: Relocate nbcon_atomic_emit_one() John Ogness
2024-08-27 14:50 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 08/17] printk: nbcon: Use thread callback if in task context for legacy John Ogness
2024-08-27 15:09 ` Petr Mladek
2024-08-27 4:43 ` [PATCH printk v4 09/17] printk: nbcon: Rely on kthreads for normal operation John Ogness
2024-08-27 15:50 ` Petr Mladek
2024-08-27 21:13 ` John Ogness
2024-08-27 4:43 ` [PATCH printk v4 10/17] printk: Provide helper for message prepending John Ogness
2024-08-27 4:43 ` John Ogness [this message]
2024-08-27 4:43 ` [PATCH printk v4 12/17] proc: consoles: Add notation to c_start/c_stop John Ogness
2024-08-27 4:43 ` [PATCH printk v4 13/17] proc: Add nbcon support for /proc/consoles John Ogness
2024-08-27 4:43 ` [PATCH printk v4 14/17] tty: sysfs: Add nbcon support for 'active' John Ogness
2024-08-27 4:43 ` [PATCH printk v4 15/17] printk: Implement legacy printer kthread for PREEMPT_RT John Ogness
2024-08-27 4:43 ` [PATCH printk v4 16/17] printk: nbcon: Assign nice -20 for printing threads John Ogness
2024-08-27 4:43 ` [PATCH printk v4 17/17] printk: Avoid false positive lockdep report for legacy printing John Ogness
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240827044333.88596-12-john.ogness@linutronix.de \
--to=john.ogness@linutronix.de \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=senozhatsky@chromium.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®