diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-02-22 14:05:19 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-22 14:05:19 -0500 |
| commit | fc6fc7f1b1095b92d4834e69b385b91e412a7ce5 (patch) | |
| tree | 2ad451d5dac4d460830536944cef1de93be36b2a /kernel/trace/trace_selftest.c | |
| parent | ef1f87aa7ba6224bef1b750b3272ba281d8f43ed (diff) | |
| parent | 770824bdc421ff58a64db608294323571c949f4c (diff) | |
Merge branch 'linus' into x86/apic
Conflicts:
arch/x86/mach-default/setup.c
Semantic conflict resolution:
arch/x86/kernel/setup.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/trace/trace_selftest.c')
| -rw-r--r-- | kernel/trace/trace_selftest.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 88c8eb70f54a..bc8e80a86bca 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
| @@ -23,10 +23,20 @@ static int trace_test_buffer_cpu(struct trace_array *tr, int cpu) | |||
| 23 | { | 23 | { |
| 24 | struct ring_buffer_event *event; | 24 | struct ring_buffer_event *event; |
| 25 | struct trace_entry *entry; | 25 | struct trace_entry *entry; |
| 26 | unsigned int loops = 0; | ||
| 26 | 27 | ||
| 27 | while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) { | 28 | while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) { |
| 28 | entry = ring_buffer_event_data(event); | 29 | entry = ring_buffer_event_data(event); |
| 29 | 30 | ||
| 31 | /* | ||
| 32 | * The ring buffer is a size of trace_buf_size, if | ||
| 33 | * we loop more than the size, there's something wrong | ||
| 34 | * with the ring buffer. | ||
| 35 | */ | ||
| 36 | if (loops++ > trace_buf_size) { | ||
| 37 | printk(KERN_CONT ".. bad ring buffer "); | ||
| 38 | goto failed; | ||
| 39 | } | ||
| 30 | if (!trace_valid_entry(entry)) { | 40 | if (!trace_valid_entry(entry)) { |
| 31 | printk(KERN_CONT ".. invalid entry %d ", | 41 | printk(KERN_CONT ".. invalid entry %d ", |
| 32 | entry->type); | 42 | entry->type); |
| @@ -57,11 +67,20 @@ static int trace_test_buffer(struct trace_array *tr, unsigned long *count) | |||
| 57 | 67 | ||
| 58 | cnt = ring_buffer_entries(tr->buffer); | 68 | cnt = ring_buffer_entries(tr->buffer); |
| 59 | 69 | ||
| 70 | /* | ||
| 71 | * The trace_test_buffer_cpu runs a while loop to consume all data. | ||
| 72 | * If the calling tracer is broken, and is constantly filling | ||
| 73 | * the buffer, this will run forever, and hard lock the box. | ||
| 74 | * We disable the ring buffer while we do this test to prevent | ||
| 75 | * a hard lock up. | ||
| 76 | */ | ||
| 77 | tracing_off(); | ||
| 60 | for_each_possible_cpu(cpu) { | 78 | for_each_possible_cpu(cpu) { |
| 61 | ret = trace_test_buffer_cpu(tr, cpu); | 79 | ret = trace_test_buffer_cpu(tr, cpu); |
| 62 | if (ret) | 80 | if (ret) |
| 63 | break; | 81 | break; |
| 64 | } | 82 | } |
| 83 | tracing_on(); | ||
| 65 | __raw_spin_unlock(&ftrace_max_lock); | 84 | __raw_spin_unlock(&ftrace_max_lock); |
| 66 | local_irq_restore(flags); | 85 | local_irq_restore(flags); |
| 67 | 86 | ||
