Browse Source

ring-buffer: do not swap if recording is disabled

If the ring buffer recording has been disabled. Do not let
swapping of ring buffers occur. Simply return -EAGAIN.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Steven Rostedt 16 years ago
parent
commit
97b17efe45
2 changed files with 16 additions and 1 deletions
  1. 15 0
      kernel/trace/ring_buffer.c
  2. 1 1
      kernel/trace/trace.c

+ 15 - 0
kernel/trace/ring_buffer.c

@@ -2266,9 +2266,24 @@ int ring_buffer_swap_cpu(struct ring_buffer *buffer_a,
 	if (buffer_a->pages != buffer_b->pages)
 	if (buffer_a->pages != buffer_b->pages)
 		return -EINVAL;
 		return -EINVAL;
 
 
+	if (ring_buffer_flags != RB_BUFFERS_ON)
+		return -EAGAIN;
+
+	if (atomic_read(&buffer_a->record_disabled))
+		return -EAGAIN;
+
+	if (atomic_read(&buffer_b->record_disabled))
+		return -EAGAIN;
+
 	cpu_buffer_a = buffer_a->buffers[cpu];
 	cpu_buffer_a = buffer_a->buffers[cpu];
 	cpu_buffer_b = buffer_b->buffers[cpu];
 	cpu_buffer_b = buffer_b->buffers[cpu];
 
 
+	if (atomic_read(&cpu_buffer_a->record_disabled))
+		return -EAGAIN;
+
+	if (atomic_read(&cpu_buffer_b->record_disabled))
+		return -EAGAIN;
+
 	/*
 	/*
 	 * We can't do a synchronize_sched here because this
 	 * We can't do a synchronize_sched here because this
 	 * function can be called in atomic context.
 	 * function can be called in atomic context.

+ 1 - 1
kernel/trace/trace.c

@@ -415,7 +415,7 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
 
 
 	ftrace_enable_cpu();
 	ftrace_enable_cpu();
 
 
-	WARN_ON_ONCE(ret);
+	WARN_ON_ONCE(ret && ret != -EAGAIN);
 
 
 	__update_max_tr(tr, tsk, cpu);
 	__update_max_tr(tr, tsk, cpu);
 	__raw_spin_unlock(&ftrace_max_lock);
 	__raw_spin_unlock(&ftrace_max_lock);