printk/tracing: Add console output tracing
authorJohannes Berg <johannes.berg@intel.com>
Thu, 24 Nov 2011 19:03:08 +0000 (20:03 +0100)
committerSteven Rostedt <rostedt@goodmis.org>
Mon, 13 Feb 2012 18:46:05 +0000 (13:46 -0500)
Add a printk.console trace point to record any printk
messages into the trace, regardless of the current
console loglevel. This can help correlate (existing)
printk debugging with other tracing.

Link: http://lkml.kernel.org/r/1322161388.5366.54.camel@jlt3.sipsolutions.net
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
include/trace/events/printk.h [new file with mode: 0644]
kernel/printk.c

diff --git a/include/trace/events/printk.h b/include/trace/events/printk.h
new file mode 100644 (file)
index 0000000..94ec79c
--- /dev/null
@@ -0,0 +1,41 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM printk
+
+#if !defined(_TRACE_PRINTK_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_PRINTK_H
+
+#include <linux/tracepoint.h>
+
+TRACE_EVENT_CONDITION(console,
+       TP_PROTO(const char *log_buf, unsigned start, unsigned end,
+                unsigned log_buf_len),
+
+       TP_ARGS(log_buf, start, end, log_buf_len),
+
+       TP_CONDITION(start != end),
+
+       TP_STRUCT__entry(
+               __dynamic_array(char, msg, end - start + 1)
+       ),
+
+       TP_fast_assign(
+               if ((start & (log_buf_len - 1)) > (end & (log_buf_len - 1))) {
+                       memcpy(__get_dynamic_array(msg),
+                              log_buf + (start & (log_buf_len - 1)),
+                              log_buf_len - (start & (log_buf_len - 1)));
+                       memcpy((char *)__get_dynamic_array(msg) +
+                              log_buf_len - (start & (log_buf_len - 1)),
+                              log_buf, end & (log_buf_len - 1));
+               } else
+                       memcpy(__get_dynamic_array(msg),
+                              log_buf + (start & (log_buf_len - 1)),
+                              end - start);
+               ((char *)__get_dynamic_array(msg))[end - start] = 0;
+       ),
+
+       TP_printk("%s", __get_str(msg))
+);
+#endif /* _TRACE_PRINTK_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
index 13c0a1143f49438f7cc97718e61ecf5bc5b23747..cb8a6bd697c6224f521fd6f0f861ece18ad7f358 100644 (file)
@@ -44,6 +44,9 @@
 
 #include <asm/uaccess.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/printk.h>
+
 /*
  * Architectures can override it:
  */
@@ -542,6 +545,8 @@ MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"
 static void _call_console_drivers(unsigned start,
                                unsigned end, int msg_log_level)
 {
+       trace_console(&LOG_BUF(0), start, end, log_buf_len);
+
        if ((msg_log_level < console_loglevel || ignore_loglevel) &&
                        console_drivers && start != end) {
                if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {