Commit ed4a2f37 authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'tip/tracing/urgent' of...

Merge branch 'tip/tracing/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into tracing/urgent
parents 5b058bcd 4b3e3d22
...@@ -52,6 +52,7 @@ config FUNCTION_TRACER ...@@ -52,6 +52,7 @@ config FUNCTION_TRACER
depends on HAVE_FUNCTION_TRACER depends on HAVE_FUNCTION_TRACER
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
select FRAME_POINTER select FRAME_POINTER
select KALLSYMS
select TRACING select TRACING
select CONTEXT_SWITCH_TRACER select CONTEXT_SWITCH_TRACER
help help
...@@ -238,6 +239,7 @@ config STACK_TRACER ...@@ -238,6 +239,7 @@ config STACK_TRACER
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
select FUNCTION_TRACER select FUNCTION_TRACER
select STACKTRACE select STACKTRACE
select KALLSYMS
help help
This special tracer records the maximum stack footprint of the This special tracer records the maximum stack footprint of the
kernel and displays it in debugfs/tracing/stack_trace. kernel and displays it in debugfs/tracing/stack_trace.
......
...@@ -23,10 +23,20 @@ static int trace_test_buffer_cpu(struct trace_array *tr, int cpu) ...@@ -23,10 +23,20 @@ static int trace_test_buffer_cpu(struct trace_array *tr, int cpu)
{ {
struct ring_buffer_event *event; struct ring_buffer_event *event;
struct trace_entry *entry; struct trace_entry *entry;
unsigned int loops = 0;
while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) { while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) {
entry = ring_buffer_event_data(event); entry = ring_buffer_event_data(event);
/*
* The ring buffer is a size of trace_buf_size, if
* we loop more than the size, there's something wrong
* with the ring buffer.
*/
if (loops++ > trace_buf_size) {
printk(KERN_CONT ".. bad ring buffer ");
goto failed;
}
if (!trace_valid_entry(entry)) { if (!trace_valid_entry(entry)) {
printk(KERN_CONT ".. invalid entry %d ", printk(KERN_CONT ".. invalid entry %d ",
entry->type); entry->type);
...@@ -57,11 +67,20 @@ static int trace_test_buffer(struct trace_array *tr, unsigned long *count) ...@@ -57,11 +67,20 @@ static int trace_test_buffer(struct trace_array *tr, unsigned long *count)
cnt = ring_buffer_entries(tr->buffer); cnt = ring_buffer_entries(tr->buffer);
/*
* The trace_test_buffer_cpu runs a while loop to consume all data.
* If the calling tracer is broken, and is constantly filling
* the buffer, this will run forever, and hard lock the box.
* We disable the ring buffer while we do this test to prevent
* a hard lock up.
*/
tracing_off();
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
ret = trace_test_buffer_cpu(tr, cpu); ret = trace_test_buffer_cpu(tr, cpu);
if (ret) if (ret)
break; break;
} }
tracing_on();
__raw_spin_unlock(&ftrace_max_lock); __raw_spin_unlock(&ftrace_max_lock);
local_irq_restore(flags); local_irq_restore(flags);
......
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