From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Slava Pestov <slavapestov@google.com>
Subject: [PATCH 04/22] ring-buffer: Add a dropped events counter
Date: Fri, 02 Nov 2012 09:32:56 -0400 [thread overview]
Message-ID: <20121102133458.588749408@goodmis.org> (raw)
In-Reply-To: 20121102133251.998500247@goodmis.org
[-- Attachment #1: Type: text/plain, Size: 5508 bytes --]
From: Slava Pestov <slavapestov@google.com>
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>
---
include/linux/ring_buffer.h | 1 +
kernel/trace/ring_buffer.c | 41 +++++++++++++++++++++++++++++++++++------
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 6c8835f..2007375 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);
unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu);
unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu);
unsigned long ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu);
+unsigned long ring_buffer_dropped_events_cpu(struct ring_buffer *buffer, int cpu);
u64 ring_buffer_time_stamp(struct ring_buffer *buffer, int cpu);
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 b979426..0ebeb1d 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -460,9 +460,10 @@ struct ring_buffer_per_cpu {
unsigned long lost_events;
unsigned long last_overrun;
local_t entries_bytes;
- local_t commit_overrun;
- local_t overrun;
local_t entries;
+ local_t overrun;
+ local_t commit_overrun;
+ local_t dropped_events;
local_t committing;
local_t commits;
unsigned long read;
@@ -2155,8 +2156,10 @@ rb_move_tail(struct ring_buffer_per_cpu *cpu_buffer,
* If we are not in overwrite mode,
* this is easy, just stop here.
*/
- if (!(buffer->flags & RB_FL_OVERWRITE))
+ if (!(buffer->flags & RB_FL_OVERWRITE)) {
+ local_inc(&cpu_buffer->dropped_events);
goto out_reset;
+ }
ret = rb_handle_head_page(cpu_buffer,
tail_page,
@@ -2995,7 +2998,8 @@ unsigned long ring_buffer_entries_cpu(struct ring_buffer *buffer, int cpu)
EXPORT_SYMBOL_GPL(ring_buffer_entries_cpu);
/**
- * ring_buffer_overrun_cpu - get the number of overruns in a cpu_buffer
+ * ring_buffer_overrun_cpu - get the number of overruns caused by the ring
+ * buffer wrapping around (only if RB_FL_OVERWRITE is on).
* @buffer: The ring buffer
* @cpu: The per CPU buffer to get the number of overruns from
*/
@@ -3015,7 +3019,9 @@ unsigned long ring_buffer_overrun_cpu(struct ring_buffer *buffer, int cpu)
EXPORT_SYMBOL_GPL(ring_buffer_overrun_cpu);
/**
- * ring_buffer_commit_overrun_cpu - get the number of overruns caused by commits
+ * ring_buffer_commit_overrun_cpu - get the number of overruns caused by
+ * commits failing due to the buffer wrapping around while there are uncommitted
+ * events, such as during an interrupt storm.
* @buffer: The ring buffer
* @cpu: The per CPU buffer to get the number of overruns from
*/
@@ -3036,6 +3042,28 @@ ring_buffer_commit_overrun_cpu(struct ring_buffer *buffer, int cpu)
EXPORT_SYMBOL_GPL(ring_buffer_commit_overrun_cpu);
/**
+ * ring_buffer_dropped_events_cpu - get the number of dropped events caused by
+ * the ring buffer filling up (only if RB_FL_OVERWRITE is off).
+ * @buffer: The ring buffer
+ * @cpu: The per CPU buffer to get the number of overruns from
+ */
+unsigned long
+ring_buffer_dropped_events_cpu(struct ring_buffer *buffer, int cpu)
+{
+ struct ring_buffer_per_cpu *cpu_buffer;
+ unsigned long ret;
+
+ if (!cpumask_test_cpu(cpu, buffer->cpumask))
+ return 0;
+
+ cpu_buffer = buffer->buffers[cpu];
+ ret = local_read(&cpu_buffer->dropped_events);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ring_buffer_dropped_events_cpu);
+
+/**
* ring_buffer_entries - get the number of entries in a buffer
* @buffer: The ring buffer
*
@@ -3864,9 +3892,10 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
local_set(&cpu_buffer->reader_page->page->commit, 0);
cpu_buffer->reader_page->read = 0;
- local_set(&cpu_buffer->commit_overrun, 0);
local_set(&cpu_buffer->entries_bytes, 0);
local_set(&cpu_buffer->overrun, 0);
+ local_set(&cpu_buffer->commit_overrun, 0);
+ local_set(&cpu_buffer->dropped_events, 0);
local_set(&cpu_buffer->entries, 0);
local_set(&cpu_buffer->committing, 0);
local_set(&cpu_buffer->commits, 0);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index f6928ed..36c213f 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4385,6 +4385,9 @@ tracing_stats_read(struct file *filp, char __user *ubuf,
usec_rem = do_div(t, USEC_PER_SEC);
trace_seq_printf(s, "now ts: %5llu.%06lu\n", t, usec_rem);
+ cnt = ring_buffer_dropped_events_cpu(tr->buffer, cpu);
+ trace_seq_printf(s, "dropped events: %ld\n", cnt);
+
count = simple_read_from_buffer(ubuf, count, ppos, s->buffer, s->len);
kfree(s);
--
1.7.10.4
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 490 bytes --]
next prev parent reply other threads:[~2012-11-02 13:35 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-02 13:32 [PATCH 00/22] [GIT PULL][3.8] tracing: updates Steven Rostedt
2012-11-02 13:32 ` [PATCH 01/22] tracing: Replace strict_strto* with kstrto* Steven Rostedt
2012-11-02 13:32 ` [PATCH 02/22] tracing: Allow tracers to start at core initcall Steven Rostedt
2012-11-02 13:32 ` [PATCH 03/22] tracing: Change tracers integer flags to bool Steven Rostedt
2012-11-02 13:32 ` Steven Rostedt [this message]
2012-11-02 13:32 ` [PATCH 05/22] tracing: Expand ring buffer when trace_printk() is used Steven Rostedt
2012-11-02 13:32 ` [PATCH 06/22] tracing: Enable comm recording if " Steven Rostedt
2012-11-02 13:32 ` [PATCH 07/22] tracing: Have tracing_sched_wakeup_trace() use standard unlock_commit Steven Rostedt
2012-11-02 13:33 ` [PATCH 08/22] tracing: Cache comms only after an event occurred Steven Rostedt
2012-11-02 13:33 ` [PATCH 09/22] tracing: Trivial cleanup Steven Rostedt
2012-11-02 13:33 ` [PATCH 10/22] tracing: Cleanup unnecessary function declarations Steven Rostedt
2012-11-02 13:33 ` [PATCH 11/22] linux/kernel.h: Remove duplicate trace_printk declaration Steven Rostedt
2012-11-02 13:33 ` [PATCH 12/22] tracing,x86: Add a TSC trace_clock Steven Rostedt
2012-11-02 13:33 ` [PATCH 13/22] tracing: Reset ring buffer when changing trace_clocks Steven Rostedt
2012-11-02 13:33 ` [PATCH 14/22] tracing: Format non-nanosec times from tsc clock without a decimal point Steven Rostedt
2012-11-02 13:33 ` [PATCH 15/22] ring-buffer: Change unsigned long type of ring_buffer_oldest_event_ts() to u64 Steven Rostedt
2012-11-02 13:33 ` [PATCH 16/22] tracing: Show raw time stamp on stats per cpu using counter or tsc mode for trace_clock Steven Rostedt
2012-11-02 13:33 ` [PATCH 17/22] tracing: Separate open function from set_event and available_events Steven Rostedt
2012-11-02 13:33 ` [PATCH 18/22] tracing: Remove unused function unregister_tracer() Steven Rostedt
2012-11-02 13:33 ` [PATCH 19/22] tracing: Make tracing_enabled be equal to tracing_on Steven Rostedt
2012-11-02 13:33 ` [PATCH 20/22] tracing: Remove deprecated tracing_enabled file Steven Rostedt
2012-11-02 13:33 ` [PATCH 21/22] tracing: Use irq_work for wake ups and remove *_nowake_*() functions Steven Rostedt
2012-11-02 13:33 ` [PATCH 22/22] tracing: Add trace_options kernel command line parameter Steven Rostedt
2012-11-02 14:08 ` [PATCH 00/22] [GIT PULL][3.8] tracing: updates Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121102133458.588749408@goodmis.org \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=slavapestov@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox