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 f970d461b2ba..517bdb061083 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -5601,6 +5601,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
@@ -5612,15 +5615,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);
 
@@ -6297,11 +6303,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;
@@ -6439,12 +6448,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.55.0.229.g6434b31f56-goog


Reply via email to