diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index a7fa0702be1c..5c38c81496ce 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -830,6 +830,8 @@ int register_tracer(struct tracer *type) | |||
| 830 | current_trace = saved_tracer; | 830 | current_trace = saved_tracer; |
| 831 | if (ret) { | 831 | if (ret) { |
| 832 | printk(KERN_CONT "FAILED!\n"); | 832 | printk(KERN_CONT "FAILED!\n"); |
| 833 | /* Add the warning after printing 'FAILED' */ | ||
| 834 | WARN_ON(1); | ||
| 833 | goto out; | 835 | goto out; |
| 834 | } | 836 | } |
| 835 | /* Only reset on passing, to avoid touching corrupted buffers */ | 837 | /* Only reset on passing, to avoid touching corrupted buffers */ |
| @@ -1708,9 +1710,11 @@ EXPORT_SYMBOL_GPL(trace_vprintk); | |||
| 1708 | 1710 | ||
| 1709 | static void trace_iterator_increment(struct trace_iterator *iter) | 1711 | static void trace_iterator_increment(struct trace_iterator *iter) |
| 1710 | { | 1712 | { |
| 1713 | struct ring_buffer_iter *buf_iter = trace_buffer_iter(iter, iter->cpu); | ||
| 1714 | |||
| 1711 | iter->idx++; | 1715 | iter->idx++; |
| 1712 | if (iter->buffer_iter[iter->cpu]) | 1716 | if (buf_iter) |
| 1713 | ring_buffer_read(iter->buffer_iter[iter->cpu], NULL); | 1717 | ring_buffer_read(buf_iter, NULL); |
| 1714 | } | 1718 | } |
| 1715 | 1719 | ||
| 1716 | static struct trace_entry * | 1720 | static struct trace_entry * |
| @@ -1718,7 +1722,7 @@ peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts, | |||
| 1718 | unsigned long *lost_events) | 1722 | unsigned long *lost_events) |
| 1719 | { | 1723 | { |
| 1720 | struct ring_buffer_event *event; | 1724 | struct ring_buffer_event *event; |
| 1721 | struct ring_buffer_iter *buf_iter = iter->buffer_iter[cpu]; | 1725 | struct ring_buffer_iter *buf_iter = trace_buffer_iter(iter, cpu); |
| 1722 | 1726 | ||
| 1723 | if (buf_iter) | 1727 | if (buf_iter) |
| 1724 | event = ring_buffer_iter_peek(buf_iter, ts); | 1728 | event = ring_buffer_iter_peek(buf_iter, ts); |
| @@ -1856,10 +1860,10 @@ void tracing_iter_reset(struct trace_iterator *iter, int cpu) | |||
| 1856 | 1860 | ||
| 1857 | tr->data[cpu]->skipped_entries = 0; | 1861 | tr->data[cpu]->skipped_entries = 0; |
| 1858 | 1862 | ||
| 1859 | if (!iter->buffer_iter[cpu]) | 1863 | buf_iter = trace_buffer_iter(iter, cpu); |
| 1864 | if (!buf_iter) | ||
| 1860 | return; | 1865 | return; |
| 1861 | 1866 | ||
| 1862 | buf_iter = iter->buffer_iter[cpu]; | ||
| 1863 | ring_buffer_iter_reset(buf_iter); | 1867 | ring_buffer_iter_reset(buf_iter); |
| 1864 | 1868 | ||
| 1865 | /* | 1869 | /* |
| @@ -2205,13 +2209,15 @@ static enum print_line_t print_bin_fmt(struct trace_iterator *iter) | |||
| 2205 | 2209 | ||
| 2206 | int trace_empty(struct trace_iterator *iter) | 2210 | int trace_empty(struct trace_iterator *iter) |
| 2207 | { | 2211 | { |
| 2212 | struct ring_buffer_iter *buf_iter; | ||
| 2208 | int cpu; | 2213 | int cpu; |
| 2209 | 2214 | ||
| 2210 | /* If we are looking at one CPU buffer, only check that one */ | 2215 | /* If we are looking at one CPU buffer, only check that one */ |
| 2211 | if (iter->cpu_file != TRACE_PIPE_ALL_CPU) { | 2216 | if (iter->cpu_file != TRACE_PIPE_ALL_CPU) { |
| 2212 | cpu = iter->cpu_file; | 2217 | cpu = iter->cpu_file; |
| 2213 | if (iter->buffer_iter[cpu]) { | 2218 | buf_iter = trace_buffer_iter(iter, cpu); |
| 2214 | if (!ring_buffer_iter_empty(iter->buffer_iter[cpu])) | 2219 | if (buf_iter) { |
| 2220 | if (!ring_buffer_iter_empty(buf_iter)) | ||
| 2215 | return 0; | 2221 | return 0; |
| 2216 | } else { | 2222 | } else { |
| 2217 | if (!ring_buffer_empty_cpu(iter->tr->buffer, cpu)) | 2223 | if (!ring_buffer_empty_cpu(iter->tr->buffer, cpu)) |
| @@ -2221,8 +2227,9 @@ int trace_empty(struct trace_iterator *iter) | |||
| 2221 | } | 2227 | } |
| 2222 | 2228 | ||
| 2223 | for_each_tracing_cpu(cpu) { | 2229 | for_each_tracing_cpu(cpu) { |
| 2224 | if (iter->buffer_iter[cpu]) { | 2230 | buf_iter = trace_buffer_iter(iter, cpu); |
| 2225 | if (!ring_buffer_iter_empty(iter->buffer_iter[cpu])) | 2231 | if (buf_iter) { |
| 2232 | if (!ring_buffer_iter_empty(buf_iter)) | ||
| 2226 | return 0; | 2233 | return 0; |
| 2227 | } else { | 2234 | } else { |
| 2228 | if (!ring_buffer_empty_cpu(iter->tr->buffer, cpu)) | 2235 | if (!ring_buffer_empty_cpu(iter->tr->buffer, cpu)) |
| @@ -2381,6 +2388,11 @@ __tracing_open(struct inode *inode, struct file *file) | |||
| 2381 | if (!iter) | 2388 | if (!iter) |
| 2382 | return ERR_PTR(-ENOMEM); | 2389 | return ERR_PTR(-ENOMEM); |
| 2383 | 2390 | ||
| 2391 | iter->buffer_iter = kzalloc(sizeof(*iter->buffer_iter) * num_possible_cpus(), | ||
| 2392 | GFP_KERNEL); | ||
| 2393 | if (!iter->buffer_iter) | ||
| 2394 | goto release; | ||
| 2395 | |||
| 2384 | /* | 2396 | /* |
| 2385 | * We make a copy of the current tracer to avoid concurrent | 2397 | * We make a copy of the current tracer to avoid concurrent |
| 2386 | * changes on it while we are reading. | 2398 | * changes on it while we are reading. |
| @@ -2441,6 +2453,8 @@ __tracing_open(struct inode *inode, struct file *file) | |||
| 2441 | fail: | 2453 | fail: |
| 2442 | mutex_unlock(&trace_types_lock); | 2454 | mutex_unlock(&trace_types_lock); |
| 2443 | kfree(iter->trace); | 2455 | kfree(iter->trace); |
| 2456 | kfree(iter->buffer_iter); | ||
| 2457 | release: | ||
| 2444 | seq_release_private(inode, file); | 2458 | seq_release_private(inode, file); |
| 2445 | return ERR_PTR(-ENOMEM); | 2459 | return ERR_PTR(-ENOMEM); |
| 2446 | } | 2460 | } |
| @@ -2481,6 +2495,7 @@ static int tracing_release(struct inode *inode, struct file *file) | |||
| 2481 | mutex_destroy(&iter->mutex); | 2495 | mutex_destroy(&iter->mutex); |
| 2482 | free_cpumask_var(iter->started); | 2496 | free_cpumask_var(iter->started); |
| 2483 | kfree(iter->trace); | 2497 | kfree(iter->trace); |
| 2498 | kfree(iter->buffer_iter); | ||
| 2484 | seq_release_private(inode, file); | 2499 | seq_release_private(inode, file); |
| 2485 | return 0; | 2500 | return 0; |
| 2486 | } | 2501 | } |
| @@ -3172,10 +3187,10 @@ static int tracing_set_tracer(const char *buf) | |||
| 3172 | } | 3187 | } |
| 3173 | destroy_trace_option_files(topts); | 3188 | destroy_trace_option_files(topts); |
| 3174 | 3189 | ||
| 3175 | current_trace = t; | 3190 | current_trace = &nop_trace; |
| 3176 | 3191 | ||
| 3177 | topts = create_trace_option_files(current_trace); | 3192 | topts = create_trace_option_files(t); |
| 3178 | if (current_trace->use_max_tr) { | 3193 | if (t->use_max_tr) { |
| 3179 | int cpu; | 3194 | int cpu; |
| 3180 | /* we need to make per cpu buffer sizes equivalent */ | 3195 | /* we need to make per cpu buffer sizes equivalent */ |
| 3181 | for_each_tracing_cpu(cpu) { | 3196 | for_each_tracing_cpu(cpu) { |
| @@ -3195,6 +3210,7 @@ static int tracing_set_tracer(const char *buf) | |||
| 3195 | goto out; | 3210 | goto out; |
| 3196 | } | 3211 | } |
| 3197 | 3212 | ||
| 3213 | current_trace = t; | ||
| 3198 | trace_branch_enable(tr); | 3214 | trace_branch_enable(tr); |
| 3199 | out: | 3215 | out: |
| 3200 | mutex_unlock(&trace_types_lock); | 3216 | mutex_unlock(&trace_types_lock); |
