summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0094-printk-ringbuffer-Skip-non-finalized-records-in-pani.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches-rt/0094-printk-ringbuffer-Skip-non-finalized-records-in-pani.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/debian/patches-rt/0094-printk-ringbuffer-Skip-non-finalized-records-in-pani.patch b/debian/patches-rt/0094-printk-ringbuffer-Skip-non-finalized-records-in-pani.patch
new file mode 100644
index 000000000..56c675cea
--- /dev/null
+++ b/debian/patches-rt/0094-printk-ringbuffer-Skip-non-finalized-records-in-pani.patch
@@ -0,0 +1,68 @@
+From: John Ogness <john.ogness@linutronix.de>
+Date: Fri, 13 Oct 2023 10:23:11 +0000
+Subject: [PATCH 094/134] printk: ringbuffer: Skip non-finalized records in
+ panic
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patches-6.6.7-rt18.tar.xz
+
+Normally a reader will stop once reaching a non-finalized
+record. However, when a panic happens, writers from other CPUs
+(or an interrupted context on the panic CPU) may have been
+writing a record and were unable to finalize it. The panic CPU
+will reserve/commit/finalize its panic records, but these will
+be located after the non-finalized records. This results in
+panic() not flushing the panic messages.
+
+Extend _prb_read_valid() to skip over non-finalized records if
+on the panic CPU.
+
+Fixes: 896fbe20b4e2 ("printk: use the lockless ringbuffer")
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/printk/printk_ringbuffer.c | 28 ++++++++++++++++++++++++++--
+ 1 file changed, 26 insertions(+), 2 deletions(-)
+
+--- a/kernel/printk/printk_ringbuffer.c
++++ b/kernel/printk/printk_ringbuffer.c
+@@ -2107,6 +2107,10 @@ u64 prb_next_reserve_seq(struct printk_r
+ *
+ * On failure @seq is updated to a record that is not yet available to the
+ * reader, but it will be the next record available to the reader.
++ *
++ * Note: When the current CPU is in panic, this function will skip over any
++ * non-existent/non-finalized records in order to allow the panic CPU
++ * to print any and all records that have been finalized.
+ */
+ static bool _prb_read_valid(struct printk_ringbuffer *rb, u64 *seq,
+ struct printk_record *r, unsigned int *line_count)
+@@ -2129,8 +2133,28 @@ static bool _prb_read_valid(struct print
+ (*seq)++;
+
+ } else {
+- /* Non-existent/non-finalized record. Must stop. */
+- return false;
++ /*
++ * Non-existent/non-finalized record. Must stop.
++ *
++ * For panic situations it cannot be expected that
++ * non-finalized records will become finalized. But
++ * there may be other finalized records beyond that
++ * need to be printed for a panic situation. If this
++ * is the panic CPU, skip this
++ * non-existent/non-finalized record unless it is
++ * at or beyond the head, in which case it is not
++ * possible to continue.
++ *
++ * Note that new messages printed on panic CPU are
++ * finalized when we are here. The only exception
++ * might be the last message without trailing newline.
++ * But it would have the sequence number returned
++ * by "prb_next_reserve_seq() - 1".
++ */
++ if (this_cpu_in_panic() && ((*seq + 1) < prb_next_reserve_seq(rb)))
++ (*seq)++;
++ else
++ return false;
+ }
+ }
+