Skip to content

Commit

Permalink
ring-buffer: add locks around rb_per_cpu_empty
Browse files Browse the repository at this point in the history
The checking of whether the buffer is empty or not needs to be serialized
among the readers. Add the reader spin lock around it.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jun 17, 2009
1 parent 5f78abe commit d478820
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions kernel/trace/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2756,12 +2756,17 @@ EXPORT_SYMBOL_GPL(ring_buffer_reset);
int ring_buffer_empty(struct ring_buffer *buffer)
{
struct ring_buffer_per_cpu *cpu_buffer;
unsigned long flags;
int cpu;
int ret;

/* yes this is racy, but if you don't like the race, lock the buffer */
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
if (!rb_per_cpu_empty(cpu_buffer))
spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
ret = rb_per_cpu_empty(cpu_buffer);
spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
if (!ret)
return 0;
}

Expand All @@ -2777,14 +2782,16 @@ EXPORT_SYMBOL_GPL(ring_buffer_empty);
int ring_buffer_empty_cpu(struct ring_buffer *buffer, int cpu)
{
struct ring_buffer_per_cpu *cpu_buffer;
unsigned long flags;
int ret;

if (!cpumask_test_cpu(cpu, buffer->cpumask))
return 1;

cpu_buffer = buffer->buffers[cpu];
spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
ret = rb_per_cpu_empty(cpu_buffer);

spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);

return ret;
}
Expand Down

0 comments on commit d478820

Please sign in to comment.