diff options
-rw-r--r-- | include/linux/ring_buffer.h | 1 | ||||
-rw-r--r-- | kernel/trace/ring_buffer.c | 41 | ||||
-rw-r--r-- | kernel/trace/trace.c | 3 |
3 files changed, 39 insertions, 6 deletions
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 6c8835f74f79..2007375cfe77 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -166,6 +166,7 @@ unsigned long ring_buffer_overruns(struct ring_buffer *buffer); | |||
166 | unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu); | 166 | unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu); |
167 | unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu); | 167 | unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu); |
168 | unsigned long ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu); | 168 | unsigned long ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu); |
169 | unsigned long ring_buffer_dropped_events_cpu(struct ring_buffer *buffer, int cpu); | ||
169 | 170 | ||
170 | u64 ring_buffer_time_stamp(struct ring_buffer *buffer, int cpu); | 171 | u64 ring_buffer_time_stamp(struct ring_buffer *buffer, int cpu); |
171 | void ring_buffer_normalize_time_stamp(struct ring_buffer *buffer, | 172 | void ring_buffer_normalize_time_stamp(struct ring_buffer *buffer, |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index b979426d16c6..0ebeb1d76ddf 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -460,9 +460,10 @@ struct ring_buffer_per_cpu { | |||
460 | unsigned long lost_events; | 460 | unsigned long lost_events; |
461 | unsigned long last_overrun; | 461 | unsigned long last_overrun; |
462 | local_t entries_bytes; | 462 | local_t entries_bytes; |
463 | local_t commit_overrun; | ||
464 | local_t overrun; | ||
465 | local_t entries; | 463 | local_t entries; |
464 | local_t overrun; | ||
465 | local_t commit_overrun; | ||
466 | local_t dropped_events; | ||
466 | local_t committing; | 467 | local_t committing; |
467 | local_t commits; | 468 | local_t commits; |
468 | unsigned long read; | 469 | unsigned long read; |
@@ -2155,8 +2156,10 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer, | |||
2155 | * If we are not in overwrite mode, | 2156 | * If we are not in overwrite mode, |
2156 | * this is easy, just stop here. | 2157 | * this is easy, just stop here. |
2157 | */ | 2158 | */ |
2158 | if (!(buffer->flags & RB_FL_OVERWRITE)) | 2159 | if (!(buffer->flags & RB_FL_OVERWRITE)) { |
2160 | local_inc(&cpu_buffer->dropped_events); | ||
2159 | goto out_reset; | 2161 | goto out_reset; |
2162 | } | ||
2160 | 2163 | ||
2161 | ret = rb_handle_head_page(cpu_buffer, | 2164 | ret = rb_handle_head_page(cpu_buffer, |
2162 | tail_page, | 2165 | tail_page, |
@@ -2995,7 +2998,8 @@ unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu) | |||
2995 | EXPORT_SYMBOL_GPL(ring_buffer_entries_cpu); | 2998 | EXPORT_SYMBOL_GPL(ring_buffer_entries_cpu); |
2996 | 2999 | ||
2997 | /** | 3000 | /** |
2998 | * ring_buffer_overrun_cpu - get the number of overruns in a cpu_buffer | 3001 | * ring_buffer_overrun_cpu - get the number of overruns caused by the ring |
3002 | * buffer wrapping around (only if RB_FL_OVERWRITE is on). | ||
2999 | * @buffer: The ring buffer | 3003 | * @buffer: The ring buffer |
3000 | * @cpu: The per CPU buffer to get the number of overruns from | 3004 | * @cpu: The per CPU buffer to get the number of overruns from |
3001 | */ | 3005 | */ |
@@ -3015,7 +3019,9 @@ unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu) | |||
3015 | EXPORT_SYMBOL_GPL(ring_buffer_overrun_cpu); | 3019 | EXPORT_SYMBOL_GPL(ring_buffer_overrun_cpu); |
3016 | 3020 | ||
3017 | /** | 3021 | /** |
3018 | * ring_buffer_commit_overrun_cpu - get the number of overruns caused by commits | 3022 | * ring_buffer_commit_overrun_cpu - get the number of overruns caused by |
3023 | * commits failing due to the buffer wrapping around while there are uncommitted | ||
3024 | * events, such as during an interrupt storm. | ||
3019 | * @buffer: The ring buffer | 3025 | * @buffer: The ring buffer |
3020 | * @cpu: The per CPU buffer to get the number of overruns from | 3026 | * @cpu: The per CPU buffer to get the number of overruns from |
3021 | */ | 3027 | */ |
@@ -3036,6 +3042,28 @@ ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu) | |||
3036 | EXPORT_SYMBOL_GPL(ring_buffer_commit_overrun_cpu); | 3042 | EXPORT_SYMBOL_GPL(ring_buffer_commit_overrun_cpu); |
3037 | 3043 | ||
3038 | /** | 3044 | /** |
3045 | * ring_buffer_dropped_events_cpu - get the number of dropped events caused by | ||
3046 | * the ring buffer filling up (only if RB_FL_OVERWRITE is off). | ||
3047 | * @buffer: The ring buffer | ||
3048 | * @cpu: The per CPU buffer to get the number of overruns from | ||
3049 | */ | ||
3050 | unsigned long | ||
3051 | ring_buffer_dropped_events_cpu(struct ring_buffer *buffer, int cpu) | ||
3052 | { | ||
3053 | struct ring_buffer_per_cpu *cpu_buffer; | ||
3054 | unsigned long ret; | ||
3055 | |||
3056 | if (!cpumask_test_cpu(cpu, buffer->cpumask)) | ||
3057 | return 0; | ||
3058 | |||
3059 | cpu_buffer = buffer->buffers[cpu]; | ||
3060 | ret = local_read(&cpu_buffer->dropped_events); | ||
3061 | |||
3062 | return ret; | ||
3063 | } | ||
3064 | EXPORT_SYMBOL_GPL(ring_buffer_dropped_events_cpu); | ||
3065 | |||
3066 | /** | ||
3039 | * ring_buffer_entries - get the number of entries in a buffer | 3067 | * ring_buffer_entries - get the number of entries in a buffer |
3040 | * @buffer: The ring buffer | 3068 | * @buffer: The ring buffer |
3041 | * | 3069 | * |
@@ -3864,9 +3892,10 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer) | |||
3864 | local_set(&cpu_buffer->reader_page->page->commit, 0); | 3892 | local_set(&cpu_buffer->reader_page->page->commit, 0); |
3865 | cpu_buffer->reader_page->read = 0; | 3893 | cpu_buffer->reader_page->read = 0; |
3866 | 3894 | ||
3867 | local_set(&cpu_buffer->commit_overrun, 0); | ||
3868 | local_set(&cpu_buffer->entries_bytes, 0); | 3895 | local_set(&cpu_buffer->entries_bytes, 0); |
3869 | local_set(&cpu_buffer->overrun, 0); | 3896 | local_set(&cpu_buffer->overrun, 0); |
3897 | local_set(&cpu_buffer->commit_overrun, 0); | ||
3898 | local_set(&cpu_buffer->dropped_events, 0); | ||
3870 | local_set(&cpu_buffer->entries, 0); | 3899 | local_set(&cpu_buffer->entries, 0); |
3871 | local_set(&cpu_buffer->committing, 0); | 3900 | local_set(&cpu_buffer->committing, 0); |
3872 | local_set(&cpu_buffer->commits, 0); | 3901 | local_set(&cpu_buffer->commits, 0); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index f6928edacd6d..36c213fbfce7 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -4385,6 +4385,9 @@ tracing_stats_read(struct file *filp, char __user *ubuf, | |||
4385 | usec_rem = do_div(t, USEC_PER_SEC); | 4385 | usec_rem = do_div(t, USEC_PER_SEC); |
4386 | trace_seq_printf(s, "now ts: %5llu.%06lu\n", t, usec_rem); | 4386 | trace_seq_printf(s, "now ts: %5llu.%06lu\n", t, usec_rem); |
4387 | 4387 | ||
4388 | cnt = ring_buffer_dropped_events_cpu(tr->buffer, cpu); | ||
4389 | trace_seq_printf(s, "dropped events: %ld\n", cnt); | ||
4390 | |||
4388 | count = simple_read_from_buffer(ubuf, count, ppos, s->buffer, s->len); | 4391 | count = simple_read_from_buffer(ubuf, count, ppos, s->buffer, s->len); |
4389 | 4392 | ||
4390 | kfree(s); | 4393 | kfree(s); |