tracing: Add a counter clock for those that do not trust clocks
authorSteven Rostedt <srostedt@redhat.com>
Mon, 19 Sep 2011 15:35:58 +0000 (11:35 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Mon, 19 Sep 2011 15:35:58 +0000 (11:35 -0400)
When debugging tight race conditions, it can be helpful to have a
synchronized tracing method. Although in most cases the global clock
provides this functionality, if timings is not the issue, it is more
comforting to know that the order of events really happened in a precise
order.

Instead of using a clock, add a "counter" that is simply an incrementing
atomic 64bit counter that orders the events as they are perceived to
happen.

The trace_clock_counter() is added from the attempt by Peter Zijlstra
trying to convert the trace_clock_global() to it. I took Peter's counter
code and made trace_clock_counter() instead, and added it to the choice
of clocks. Just echo counter > /debug/tracing/trace_clock to activate
it.

Requested-by: Thomas Gleixner <tglx@linutronix.de>
Requested-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Reviewed-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/linux/trace_clock.h
kernel/trace/trace.c
kernel/trace/trace_clock.c

index 7a8130384087422668463ca916bd623c75d4adcf..4eb490237d4c20c0f65cae5581e2e07e8b8f2721 100644 (file)
@@ -15,5 +15,6 @@
 extern u64 notrace trace_clock_local(void);
 extern u64 notrace trace_clock(void);
 extern u64 notrace trace_clock_global(void);
+extern u64 notrace trace_clock_counter(void);
 
 #endif /* _LINUX_TRACE_CLOCK_H */
index b41907000bc605e5a65d8e475a70ac422df5011c..4b8df0dc9358b70d3f20d1bccca179c0ff635f80 100644 (file)
@@ -435,6 +435,7 @@ static struct {
 } trace_clocks[] = {
        { trace_clock_local,    "local" },
        { trace_clock_global,   "global" },
+       { trace_clock_counter,  "counter" },
 };
 
 int trace_clock_id;
index 6302747a13988300345bb4c9db51888a52794dd4..394783531cbb76d9f7d9ab34ae0b6963d5d14dff 100644 (file)
@@ -113,3 +113,15 @@ u64 notrace trace_clock_global(void)
 
        return now;
 }
+
+static atomic64_t trace_counter;
+
+/*
+ * trace_clock_counter(): simply an atomic counter.
+ * Use the trace_counter "counter" for cases where you do not care
+ * about timings, but are interested in strict ordering.
+ */
+u64 notrace trace_clock_counter(void)
+{
+       return atomic64_add_return(1, &trace_counter);
+}