summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch')
-rw-r--r--debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch b/debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch
new file mode 100644
index 0000000000..d96f2dc2b9
--- /dev/null
+++ b/debian/patches-rt/0101-printk-nbcon-Ensure-ownership-release-on-failed-emit.patch
@@ -0,0 +1,58 @@
+From: John Ogness <john.ogness@linutronix.de>
+Date: Fri, 20 Oct 2023 09:52:59 +0000
+Subject: [PATCH 101/134] printk: nbcon: Ensure ownership release on failed
+ emit
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6.7-rt18.tar.xz
+
+Until now it was assumed that ownership has been lost when the
+write_atomic() callback fails. nbcon_emit_next_record() only
+returns false when ownership has been lost.
+
+Ensure ownership has been lost before reporting failure by
+explicitly attempting a release. If the current context is not
+the owner, the release has no effect.
+
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/printk/nbcon.c | 19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+--- a/kernel/printk/nbcon.c
++++ b/kernel/printk/nbcon.c
+@@ -852,7 +852,7 @@ static bool nbcon_emit_next_record(struc
+ unsigned long con_dropped;
+ struct nbcon_state cur;
+ unsigned long dropped;
+- bool done;
++ bool done = false;
+
+ /*
+ * The printk buffers are filled within an unsafe section. This
+@@ -891,17 +891,18 @@ static bool nbcon_emit_next_record(struc
+ nbcon_state_read(con, &cur);
+ wctxt->unsafe_takeover = cur.unsafe_takeover;
+
+- if (con->write_atomic) {
++ if (con->write_atomic)
+ done = con->write_atomic(con, wctxt);
+- } else {
+- nbcon_context_release(ctxt);
+- WARN_ON_ONCE(1);
+- done = false;
+- }
+
+- /* If not done, the emit was aborted. */
+- if (!done)
++ if (!done) {
++ /*
++ * The emit was aborted, probably due to a loss of ownership.
++ * Ensure ownership was lost or released before reporting the
++ * loss.
++ */
++ nbcon_context_release(ctxt);
+ return false;
++ }
+
+ /*
+ * Since any dropped message was successfully output, reset the