diff options
author | Slava Pestov <slavapestov@google.com> | 2011-07-15 17:23:58 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2012-10-31 16:45:27 -0400 |
commit | 884bfe89a462fcc85c8abd96171519cf2fe70929 (patch) | |
tree | be61b3c6ee4d75198af22f5cdadc3b289b207bda /kernel/trace | |
parent | f43c738bfa8608424610e4fc1aef4d4644e2ce11 (diff) |
ring-buffer: Add a 'dropped events' counter
The existing 'overrun' counter is incremented when the ring
buffer wraps around, with overflow on (the default). We wanted
a way to count requests lost from the buffer filling up with
overflow off, too. I decided to add a new counter instead
of retro-fitting the existing one because it seems like a
different statistic to count conceptually, and also because
of how the code was structured.
Link: http://lkml.kernel.org/r/1310765038-26399-1-git-send-email-slavapestov@google.com
Signed-off-by: Slava Pestov <slavapestov@google.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/ring_buffer.c | 41 | ||||
-rw-r--r-- | kernel/trace/trace.c | 3 |
2 files changed, 38 insertions, 6 deletions
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); |