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 <[email protected]> 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
