From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: [for-next][PATCH 3/6] tracing: Only calculate stats of tracepoint benchmarks for 2^32 times
Date: Fri, 06 Jun 2014 12:30:37 -0400 [thread overview]
Message-ID: <20140606172104.552734596@goodmis.org> (raw)
In-Reply-To: 20140606163034.516780857@goodmis.org
[-- Attachment #1: 0002-tracing-Only-calculate-stats-of-tracepoint-benchmark.patch --]
[-- Type: text/plain, Size: 2706 bytes --]
From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org>
When calculating the average and standard deviation, it is required that
the count be less than UINT_MAX, otherwise the do_div() will get
undefined results. After 2^32 counts of data, the average and standard
deviation should pretty much be set anyway.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/trace_benchmark.c | 37 ++++++++++++++++++++++++++++++-------
1 file changed, 30 insertions(+), 7 deletions(-)
diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c
index 8bd3365a65b2..40a14cbcf8e0 100644
--- a/kernel/trace/trace_benchmark.c
+++ b/kernel/trace/trace_benchmark.c
@@ -16,7 +16,10 @@ static u64 bm_last;
static u64 bm_max;
static u64 bm_min;
static u64 bm_first;
-static s64 bm_cnt;
+static u64 bm_cnt;
+static u64 bm_stddev;
+static unsigned int bm_avg;
+static unsigned int bm_std;
/*
* This gets called in a loop recording the time it took to write
@@ -66,22 +69,35 @@ static void trace_do_benchmark(void)
bm_last = delta;
- bm_total += delta;
- bm_totalsq += delta * delta;
-
if (delta > bm_max)
bm_max = delta;
if (!bm_min || delta < bm_min)
bm_min = delta;
+ /*
+ * When bm_cnt is greater than UINT_MAX, it breaks the statistics
+ * accounting. Freeze the statistics when that happens.
+ * We should have enough data for the avg and stddev anyway.
+ */
+ if (bm_cnt > UINT_MAX) {
+ scnprintf(bm_str, BENCHMARK_EVENT_STRLEN,
+ "last=%llu first=%llu max=%llu min=%llu ** avg=%u std=%d std^2=%lld",
+ bm_last, bm_first, bm_max, bm_min, bm_avg, bm_std, bm_stddev);
+ return;
+ }
+
+ bm_total += delta;
+ bm_totalsq += delta * delta;
+
+
if (bm_cnt > 1) {
/*
* Apply Welford's method to calculate standard deviation:
* s^2 = 1 / (n * (n-1)) * (n * \Sum (x_i)^2 - (\Sum x_i)^2)
*/
stddev = (u64)bm_cnt * bm_totalsq - bm_total * bm_total;
- do_div(stddev, bm_cnt);
- do_div(stddev, bm_cnt - 1);
+ do_div(stddev, (u32)bm_cnt);
+ do_div(stddev, (u32)bm_cnt - 1);
} else
stddev = 0;
@@ -119,6 +135,10 @@ static void trace_do_benchmark(void)
scnprintf(bm_str, BENCHMARK_EVENT_STRLEN,
"last=%llu first=%llu max=%llu min=%llu avg=%u std=%d std^2=%lld",
bm_last, bm_first, bm_max, bm_min, avg, std, stddev);
+
+ bm_std = std;
+ bm_avg = avg;
+ bm_stddev = stddev;
}
static int benchmark_event_kthread(void *arg)
@@ -170,6 +190,9 @@ void trace_benchmark_unreg(void)
bm_max = 0;
bm_min = 0;
bm_cnt = 0;
- /* bm_first doesn't need to be reset but reset it anyway */
+ /* These don't need to be reset but reset them anyway */
bm_first = 0;
+ bm_std = 0;
+ bm_avg = 0;
+ bm_stddev = 0;
}
--
2.0.0.rc2
next prev parent reply other threads:[~2014-06-06 17:21 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-06 16:30 [for-next][PATCH 0/6] tracing: Hopefully the last updates for 3.16 merge window Steven Rostedt
2014-06-06 16:30 ` [for-next][PATCH 1/6] tracing: Introduce saved_cmdlines_size file Steven Rostedt
2014-06-06 16:30 ` [for-next][PATCH 2/6] tracing: Convert stddev into u64 in tracepoint benchmark Steven Rostedt
2014-06-06 16:30 ` Steven Rostedt [this message]
2014-06-10 5:17 ` [for-next][PATCH 3/6] tracing: Only calculate stats of tracepoint benchmarks for 2^32 times Namhyung Kim
2014-06-10 12:16 ` Steven Rostedt
2014-06-10 13:42 ` Steven Rostedt
2014-06-10 16:12 ` Steven Rostedt
2014-06-06 16:30 ` [for-next][PATCH 4/6] tracing: Return error if ftrace_trace_arrays list is empty Steven Rostedt
2014-06-10 5:20 ` Namhyung Kim
2014-06-10 13:42 ` Steven Rostedt
2014-06-06 16:30 ` [for-next][PATCH 5/6] tracing/kprobes: Avoid self tests if tracing is disabled on boot up Steven Rostedt
2014-06-06 16:30 ` [for-next][PATCH 6/6] tracing: Fix leak of ring buffer data when new instances creation fails Steven Rostedt
2014-06-10 5:25 ` Namhyung Kim
2014-06-10 15:58 ` 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=20140606172104.552734596@goodmis.org \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
/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