[PATCH v2 10/18] ring-buffer: Use panic-friendly locking in ring_buffer_iter interface
From: Vincent Donnefort
Date: Fri Jun 05 2026 - 12:49:37 EST
In preparation for allowing trace_remote to dump the buffer on panic,
make the non-consuming iterator functions panic-friendly.
Signed-off-by: Vincent Donnefort <vdonnefort@xxxxxxxxxx>
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 183326633037..88ef44e2da53 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -5444,6 +5444,9 @@ static void rb_iter_reset(struct ring_buffer_iter *iter)
}
}
+static inline bool rb_reader_lock(struct ring_buffer_per_cpu *cpu_buffer);
+static inline void rb_reader_unlock(struct ring_buffer_per_cpu *cpu_buffer, bool locked);
+
/**
* ring_buffer_iter_reset - reset an iterator
* @iter: The iterator to reset
@@ -5455,15 +5458,18 @@ void ring_buffer_iter_reset(struct ring_buffer_iter *iter)
{
struct ring_buffer_per_cpu *cpu_buffer;
unsigned long flags;
+ bool dolock;
if (!iter)
return;
cpu_buffer = iter->cpu_buffer;
- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+ local_irq_save(flags);
+ dolock = rb_reader_lock(cpu_buffer);
rb_iter_reset(iter);
- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+ rb_reader_unlock(cpu_buffer, dolock);
+ local_irq_restore(flags);
}
EXPORT_SYMBOL_GPL(ring_buffer_iter_reset);
@@ -6127,11 +6133,14 @@ ring_buffer_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
struct ring_buffer_event *event;
unsigned long flags;
+ bool dolock;
again:
- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+ local_irq_save(flags);
+ dolock = rb_reader_lock(cpu_buffer);
event = rb_iter_peek(iter, ts);
- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+ rb_reader_unlock(cpu_buffer, dolock);
+ local_irq_restore(flags);
if (event && event->type_len == RINGBUF_TYPE_PADDING)
goto again;
@@ -6269,12 +6278,15 @@ void ring_buffer_iter_advance(struct ring_buffer_iter *iter)
{
struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
unsigned long flags;
+ bool dolock;
- raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+ local_irq_save(flags);
+ dolock = rb_reader_lock(cpu_buffer);
iter->missed_events = 0;
rb_advance_iter(iter);
- raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+ rb_reader_unlock(cpu_buffer, dolock);
+ local_irq_restore(flags);
}
EXPORT_SYMBOL_GPL(ring_buffer_iter_advance);
--
2.54.0.1032.g2f8565e1d1-goog