Commit 12ef7d44 authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar

ftrace: CPU buffer start annotation clean ups

Impact: better handling of CPU buffer start annotation

Because of the confusion with the per CPU buffers wrapping where
one CPU might be more active at the end of the trace than the other
CPUs causing that one CPU to have a shorter history. Kernel
developers were confused by the "missing" data of that one CPU
at the beginning of the trace output. An annotation was added to
the trace output to show that the buffer had started:

 # tracer: function
 #
 #           TASK-PID    CPU#    TIMESTAMP  FUNCTION
 #              | |       |          |         |
 ##### CPU 3 buffer started ####
          <idle>-0     [003]   158.192959: smp_apic_timer_interrupt
 [...]
           <idle>-0     [003]   161.556520: default_idle
 ##### CPU 1 buffer started ####
           <idle>-0     [001]   161.592494: hrtimer_force_reprogram
 [etc]

But this annotation gets a bit messy when tracers do not fill the
buffers. This patch does a couple of things:

 One) it adds a flag to trace_options to disable these annotations

 Two) it does not annotate if the tracer did not overflow its buffer.

This makes the output much cleaner.
Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent ee6bce52
...@@ -205,7 +205,8 @@ static DEFINE_MUTEX(trace_types_lock); ...@@ -205,7 +205,8 @@ static DEFINE_MUTEX(trace_types_lock);
static DECLARE_WAIT_QUEUE_HEAD(trace_wait); static DECLARE_WAIT_QUEUE_HEAD(trace_wait);
/* trace_flags holds trace_options default values */ /* trace_flags holds trace_options default values */
unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK; unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK |
TRACE_ITER_ANNOTATE;
/** /**
* trace_wake_up - wake up tasks waiting for trace input * trace_wake_up - wake up tasks waiting for trace input
...@@ -261,6 +262,7 @@ static const char *trace_options[] = { ...@@ -261,6 +262,7 @@ static const char *trace_options[] = {
#ifdef CONFIG_BRANCH_TRACER #ifdef CONFIG_BRANCH_TRACER
"branch", "branch",
#endif #endif
"annotate",
NULL NULL
}; };
...@@ -1113,6 +1115,7 @@ void tracing_stop_function_trace(void) ...@@ -1113,6 +1115,7 @@ void tracing_stop_function_trace(void)
enum trace_file_type { enum trace_file_type {
TRACE_FILE_LAT_FMT = 1, TRACE_FILE_LAT_FMT = 1,
TRACE_FILE_ANNOTATE = 2,
}; };
static void trace_iterator_increment(struct trace_iterator *iter, int cpu) static void trace_iterator_increment(struct trace_iterator *iter, int cpu)
...@@ -1532,6 +1535,12 @@ static void test_cpu_buff_start(struct trace_iterator *iter) ...@@ -1532,6 +1535,12 @@ static void test_cpu_buff_start(struct trace_iterator *iter)
{ {
struct trace_seq *s = &iter->seq; struct trace_seq *s = &iter->seq;
if (!(trace_flags & TRACE_ITER_ANNOTATE))
return;
if (!(iter->iter_flags & TRACE_FILE_ANNOTATE))
return;
if (cpu_isset(iter->cpu, iter->started)) if (cpu_isset(iter->cpu, iter->started))
return; return;
...@@ -2132,6 +2141,11 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) ...@@ -2132,6 +2141,11 @@ __tracing_open(struct inode *inode, struct file *file, int *ret)
iter->trace = current_trace; iter->trace = current_trace;
iter->pos = -1; iter->pos = -1;
/* Annotate start of buffers if we had overruns */
if (ring_buffer_overruns(iter->tr->buffer))
iter->iter_flags |= TRACE_FILE_ANNOTATE;
for_each_tracing_cpu(cpu) { for_each_tracing_cpu(cpu) {
iter->buffer_iter[cpu] = iter->buffer_iter[cpu] =
......
...@@ -473,6 +473,7 @@ enum trace_iterator_flags { ...@@ -473,6 +473,7 @@ enum trace_iterator_flags {
#ifdef CONFIG_BRANCH_TRACER #ifdef CONFIG_BRANCH_TRACER
TRACE_ITER_BRANCH = 0x1000, TRACE_ITER_BRANCH = 0x1000,
#endif #endif
TRACE_ITER_ANNOTATE = 0x2000,
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment