From: "tip-bot2 for John Ogness" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: John Ogness <john.ogness@linutronix.de>,
Petr Mladek <pmladek@suse.com>,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: sched/rt] printk: nbcon: Add function for printers to reacquire ownership
Date: Mon, 09 Sep 2024 17:27:47 -0000 [thread overview]
Message-ID: <172590286704.2215.14185841229700981969.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20240904120536.115780-2-john.ogness@linutronix.de>
The following commit has been merged into the sched/rt branch of tip:
Commit-ID: bd07d864522e7c3e4ee364e91aee8754992f5855
Gitweb: https://git.kernel.org/tip/bd07d864522e7c3e4ee364e91aee8754992f5855
Author: John Ogness <john.ogness@linutronix.de>
AuthorDate: Wed, 04 Sep 2024 14:11:20 +02:06
Committer: Petr Mladek <pmladek@suse.com>
CommitterDate: Wed, 04 Sep 2024 15:56:31 +02:00
printk: nbcon: Add function for printers to reacquire ownership
Since ownership can be lost at any time due to handover or
takeover, a printing context _must_ be prepared to back out
immediately and carefully. However, there are scenarios where
the printing context must reacquire ownership in order to
finalize or revert hardware changes.
One such example is when interrupts are disabled during
printing. No other context will automagically re-enable the
interrupts. For this case, the disabling context _must_
reacquire nbcon ownership so that it can re-enable the
interrupts.
Provide nbcon_reacquire_nobuf() for exactly this purpose. It
allows a printing context to reacquire ownership using the same
priority as its previous ownership.
Note that after a successful reacquire the printing context
will have no output buffer because that has been lost. This
function cannot be used to resume printing.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20240904120536.115780-2-john.ogness@linutronix.de
Signed-off-by: Petr Mladek <pmladek@suse.com>
---
include/linux/console.h | 6 +++-
kernel/printk/nbcon.c | 74 ++++++++++++++++++++++++++++++++++++----
2 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/include/linux/console.h b/include/linux/console.h
index 9a13f91..88050d3 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -366,6 +366,10 @@ struct console {
*
* The callback should allow the takeover whenever it is safe. It
* increases the chance to see messages when the system is in trouble.
+ * If the driver must reacquire ownership in order to finalize or
+ * revert hardware changes, nbcon_reacquire_nobuf() can be used.
+ * However, on reacquire the buffer content is no longer available. A
+ * reacquire cannot be used to resume printing.
*
* The callback can be called from any context (including NMI).
* Therefore it must avoid usage of any locking and instead rely
@@ -558,12 +562,14 @@ extern void nbcon_cpu_emergency_exit(void);
extern bool nbcon_can_proceed(struct nbcon_write_context *wctxt);
extern bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt);
extern bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt);
+extern void nbcon_reacquire_nobuf(struct nbcon_write_context *wctxt);
#else
static inline void nbcon_cpu_emergency_enter(void) { }
static inline void nbcon_cpu_emergency_exit(void) { }
static inline bool nbcon_can_proceed(struct nbcon_write_context *wctxt) { return false; }
static inline bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt) { return false; }
static inline bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt) { return false; }
+static inline void nbcon_reacquire_nobuf(struct nbcon_write_context *wctxt) { }
#endif
extern int console_set_on_cmdline;
diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c
index cf62f67..8a1bf6f 100644
--- a/kernel/printk/nbcon.c
+++ b/kernel/printk/nbcon.c
@@ -830,6 +830,19 @@ out:
return nbcon_context_can_proceed(ctxt, &cur);
}
+static void nbcon_write_context_set_buf(struct nbcon_write_context *wctxt,
+ char *buf, unsigned int len)
+{
+ struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
+ struct console *con = ctxt->console;
+ struct nbcon_state cur;
+
+ wctxt->outbuf = buf;
+ wctxt->len = len;
+ nbcon_state_read(con, &cur);
+ wctxt->unsafe_takeover = cur.unsafe_takeover;
+}
+
/**
* nbcon_enter_unsafe - Enter an unsafe region in the driver
* @wctxt: The write context that was handed to the write function
@@ -845,8 +858,12 @@ out:
bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt)
{
struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
+ bool is_owner;
- return nbcon_context_enter_unsafe(ctxt);
+ is_owner = nbcon_context_enter_unsafe(ctxt);
+ if (!is_owner)
+ nbcon_write_context_set_buf(wctxt, NULL, 0);
+ return is_owner;
}
EXPORT_SYMBOL_GPL(nbcon_enter_unsafe);
@@ -865,12 +882,44 @@ EXPORT_SYMBOL_GPL(nbcon_enter_unsafe);
bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt)
{
struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
+ bool ret;
- return nbcon_context_exit_unsafe(ctxt);
+ ret = nbcon_context_exit_unsafe(ctxt);
+ if (!ret)
+ nbcon_write_context_set_buf(wctxt, NULL, 0);
+ return ret;
}
EXPORT_SYMBOL_GPL(nbcon_exit_unsafe);
/**
+ * nbcon_reacquire_nobuf - Reacquire a console after losing ownership
+ * while printing
+ * @wctxt: The write context that was handed to the write callback
+ *
+ * Since ownership can be lost at any time due to handover or takeover, a
+ * printing context _must_ be prepared to back out immediately and
+ * carefully. However, there are scenarios where the printing context must
+ * reacquire ownership in order to finalize or revert hardware changes.
+ *
+ * This function allows a printing context to reacquire ownership using the
+ * same priority as its previous ownership.
+ *
+ * Note that after a successful reacquire the printing context will have no
+ * output buffer because that has been lost. This function cannot be used to
+ * resume printing.
+ */
+void nbcon_reacquire_nobuf(struct nbcon_write_context *wctxt)
+{
+ struct nbcon_context *ctxt = &ACCESS_PRIVATE(wctxt, ctxt);
+
+ while (!nbcon_context_try_acquire(ctxt))
+ cpu_relax();
+
+ nbcon_write_context_set_buf(wctxt, NULL, 0);
+}
+EXPORT_SYMBOL_GPL(nbcon_reacquire_nobuf);
+
+/**
* nbcon_emit_next_record - Emit a record in the acquired context
* @wctxt: The write context that will be handed to the write function
*
@@ -895,7 +944,6 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt)
.pbufs = ctxt->pbufs,
};
unsigned long con_dropped;
- struct nbcon_state cur;
unsigned long dropped;
/*
@@ -930,10 +978,7 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt)
goto update_con;
/* Initialize the write context for driver callbacks. */
- wctxt->outbuf = &pmsg.pbufs->outbuf[0];
- wctxt->len = pmsg.outbuf_len;
- nbcon_state_read(con, &cur);
- wctxt->unsafe_takeover = cur.unsafe_takeover;
+ nbcon_write_context_set_buf(wctxt, &pmsg.pbufs->outbuf[0], pmsg.outbuf_len);
if (con->write_atomic) {
con->write_atomic(con, wctxt);
@@ -947,6 +992,21 @@ static bool nbcon_emit_next_record(struct nbcon_write_context *wctxt)
return false;
}
+ if (!wctxt->outbuf) {
+ /*
+ * Ownership was lost and reacquired by the driver. Handle it
+ * as if ownership was lost.
+ */
+ nbcon_context_release(ctxt);
+ return false;
+ }
+
+ /*
+ * Ownership may have been lost but _not_ reacquired by the driver.
+ * This case is detected and handled when entering unsafe to update
+ * dropped/seq values.
+ */
+
/*
* Since any dropped message was successfully output, reset the
* dropped count for the console.
next prev parent reply other threads:[~2024-09-09 17:27 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-04 12:05 [PATCH printk v6 00/17] add threaded printing + the rest John Ogness
2024-09-04 12:05 ` [PATCH printk v6 01/17] printk: nbcon: Add function for printers to reacquire ownership John Ogness
2024-09-09 17:27 ` tip-bot2 for John Ogness [this message]
2024-09-04 12:05 ` [PATCH printk v6 02/17] printk: Fail pr_flush() if before SYSTEM_SCHEDULING John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 03/17] printk: Flush console on unregister_console() John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 04/17] printk: nbcon: Add context to usable() and emit() John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 05/17] printk: nbcon: Init @nbcon_seq to highest possible John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 06/17] printk: nbcon: Introduce printer kthreads John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for Thomas Gleixner
2024-09-04 12:05 ` [PATCH printk v6 07/17] printk: nbcon: Relocate nbcon_atomic_emit_one() John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 08/17] printk: nbcon: Use thread callback if in task context for legacy John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 09/17] printk: nbcon: Rely on kthreads for normal operation John Ogness
2024-09-04 13:31 ` Petr Mladek
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 10/17] printk: Provide helper for message prepending John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 11/17] printk: nbcon: Show replay message on takeover John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 12/17] proc: consoles: Add notation to c_start/c_stop John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 13/17] proc: Add nbcon support for /proc/consoles John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 14/17] tty: sysfs: Add nbcon support for 'active' John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 15/17] printk: Implement legacy printer kthread for PREEMPT_RT John Ogness
2024-09-04 13:40 ` Petr Mladek
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 16/17] printk: nbcon: Assign nice -20 for printing threads John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 12:05 ` [PATCH printk v6 17/17] printk: Avoid false positive lockdep report for legacy printing John Ogness
2024-09-09 17:27 ` [tip: sched/rt] " tip-bot2 for John Ogness
2024-09-04 14:30 ` [PATCH printk v6 00/17] add threaded printing + the rest Petr Mladek
2024-09-04 14:55 ` 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=172590286704.2215.14185841229700981969.tip-bot2@tip-bot2 \
--to=tip-bot2@linutronix.de \
--cc=john.ogness@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=pmladek@suse.com \
--cc=x86@kernel.org \
/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®