aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_output.c
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2013-03-08 21:02:34 -0500
committerSteven Rostedt <rostedt@goodmis.org>2013-03-15 00:35:55 -0400
commit09ae72348eccb60e304cf8ce94653f4a78fcd407 (patch)
tree28c48644f71df4752556d9f5b15efb889e57af56 /kernel/trace/trace_output.c
parent153e8ed913b022d2003866a848af9fadc041403f (diff)
tracing: Add trace_puts() for even faster trace_printk() tracing
The trace_printk() is extremely fast and is very handy as it can be used in any context (including NMIs!). But it still requires scanning the fmt string for parsing the args. Even the trace_bprintk() requires a scan to know what args will be saved, although it doesn't copy the format string itself. Several times trace_printk() has no args, and wastes cpu cycles scanning the fmt string. Adding trace_puts() allows the developer to use an even faster tracing method that only saves the pointer to the string in the ring buffer without doing any format parsing at all. This will help remove even more of the "Heisenbug" effect, when debugging. Also fixed up the F_printk()s for the ftrace internal bprint and print events. Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace_output.c')
-rw-r--r--kernel/trace/trace_output.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index 2edc7220d017..19f48e7edc39 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -37,6 +37,22 @@ int trace_print_seq(struct seq_file *m, struct trace_seq *s)
37 return ret; 37 return ret;
38} 38}
39 39
40enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter)
41{
42 struct trace_seq *s = &iter->seq;
43 struct trace_entry *entry = iter->ent;
44 struct bputs_entry *field;
45 int ret;
46
47 trace_assign_type(field, entry);
48
49 ret = trace_seq_puts(s, field->str);
50 if (!ret)
51 return TRACE_TYPE_PARTIAL_LINE;
52
53 return TRACE_TYPE_HANDLED;
54}
55
40enum print_line_t trace_print_bprintk_msg_only(struct trace_iterator *iter) 56enum print_line_t trace_print_bprintk_msg_only(struct trace_iterator *iter)
41{ 57{
42 struct trace_seq *s = &iter->seq; 58 struct trace_seq *s = &iter->seq;
@@ -1244,6 +1260,64 @@ static struct trace_event trace_user_stack_event = {
1244 .funcs = &trace_user_stack_funcs, 1260 .funcs = &trace_user_stack_funcs,
1245}; 1261};
1246 1262
1263/* TRACE_BPUTS */
1264static enum print_line_t
1265trace_bputs_print(struct trace_iterator *iter, int flags,
1266 struct trace_event *event)
1267{
1268 struct trace_entry *entry = iter->ent;
1269 struct trace_seq *s = &iter->seq;
1270 struct bputs_entry *field;
1271
1272 trace_assign_type(field, entry);
1273
1274 if (!seq_print_ip_sym(s, field->ip, flags))
1275 goto partial;
1276
1277 if (!trace_seq_puts(s, ": "))
1278 goto partial;
1279
1280 if (!trace_seq_puts(s, field->str))
1281 goto partial;
1282
1283 return TRACE_TYPE_HANDLED;
1284
1285 partial:
1286 return TRACE_TYPE_PARTIAL_LINE;
1287}
1288
1289
1290static enum print_line_t
1291trace_bputs_raw(struct trace_iterator *iter, int flags,
1292 struct trace_event *event)
1293{
1294 struct bputs_entry *field;
1295 struct trace_seq *s = &iter->seq;
1296
1297 trace_assign_type(field, iter->ent);
1298
1299 if (!trace_seq_printf(s, ": %lx : ", field->ip))
1300 goto partial;
1301
1302 if (!trace_seq_puts(s, field->str))
1303 goto partial;
1304
1305 return TRACE_TYPE_HANDLED;
1306
1307 partial:
1308 return TRACE_TYPE_PARTIAL_LINE;
1309}
1310
1311static struct trace_event_functions trace_bputs_funcs = {
1312 .trace = trace_bputs_print,
1313 .raw = trace_bputs_raw,
1314};
1315
1316static struct trace_event trace_bputs_event = {
1317 .type = TRACE_BPUTS,
1318 .funcs = &trace_bputs_funcs,
1319};
1320
1247/* TRACE_BPRINT */ 1321/* TRACE_BPRINT */
1248static enum print_line_t 1322static enum print_line_t
1249trace_bprint_print(struct trace_iterator *iter, int flags, 1323trace_bprint_print(struct trace_iterator *iter, int flags,
@@ -1356,6 +1430,7 @@ static struct trace_event *events[] __initdata = {
1356 &trace_wake_event, 1430 &trace_wake_event,
1357 &trace_stack_event, 1431 &trace_stack_event,
1358 &trace_user_stack_event, 1432 &trace_user_stack_event,
1433 &trace_bputs_event,
1359 &trace_bprint_event, 1434 &trace_bprint_event,
1360 &trace_print_event, 1435 &trace_print_event,
1361 NULL 1436 NULL