aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-03-12 13:24:49 -0400
committerSteven Rostedt <srostedt@redhat.com>2009-03-12 21:15:00 -0400
commit48ead02030f849d011259244bb4ea9b985479006 (patch)
tree4500f27dc7eb6567ca79dd03fa94fe9e56fbc316 /kernel/trace
parentdb526ca329f855510e8ce672332eba3304aed590 (diff)
tracing/core: bring back raw trace_printk for dynamic formats strings
Impact: fix callsites with dynamic format strings Since its new binary implementation, trace_printk() internally uses static containers for the format strings on each callsites. But the value is assigned once at build time, which means that it can't take dynamic formats. So this patch unearthes the raw trace_printk implementation for the callers that will need trace_printk to be able to carry these dynamic format strings. The trace_printk() macro will use the appropriate implementation for each callsite. Most of the time however, the binary implementation will still be used. The other impact of this patch is that mmiotrace_printk() will use the old implementation because it calls the low level trace_vprintk and we can't guess here whether the format passed in it is dynamic or not. Some parts of this patch have been written by Steven Rostedt (most notably the part that chooses the appropriate implementation for each callsites). Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/trace.c85
-rw-r--r--kernel/trace/trace.h13
-rw-r--r--kernel/trace/trace_event_types.h11
-rw-r--r--kernel/trace/trace_functions_graph.c6
-rw-r--r--kernel/trace/trace_mmiotrace.c7
-rw-r--r--kernel/trace/trace_output.c57
-rw-r--r--kernel/trace/trace_printk.c33
7 files changed, 186 insertions, 26 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 62a63b2b33dd..dbb077d8a172 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1179,10 +1179,10 @@ void trace_graph_return(struct ftrace_graph_ret *trace)
1179 1179
1180 1180
1181/** 1181/**
1182 * trace_vprintk - write binary msg to tracing buffer 1182 * trace_vbprintk - write binary msg to tracing buffer
1183 * 1183 *
1184 */ 1184 */
1185int trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args) 1185int trace_vbprintk(unsigned long ip, int depth, const char *fmt, va_list args)
1186{ 1186{
1187 static raw_spinlock_t trace_buf_lock = 1187 static raw_spinlock_t trace_buf_lock =
1188 (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; 1188 (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
@@ -1191,7 +1191,7 @@ int trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args)
1191 struct ring_buffer_event *event; 1191 struct ring_buffer_event *event;
1192 struct trace_array *tr = &global_trace; 1192 struct trace_array *tr = &global_trace;
1193 struct trace_array_cpu *data; 1193 struct trace_array_cpu *data;
1194 struct print_entry *entry; 1194 struct bprint_entry *entry;
1195 unsigned long flags; 1195 unsigned long flags;
1196 int resched; 1196 int resched;
1197 int cpu, len = 0, size, pc; 1197 int cpu, len = 0, size, pc;
@@ -1219,7 +1219,7 @@ int trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args)
1219 goto out_unlock; 1219 goto out_unlock;
1220 1220
1221 size = sizeof(*entry) + sizeof(u32) * len; 1221 size = sizeof(*entry) + sizeof(u32) * len;
1222 event = trace_buffer_lock_reserve(tr, TRACE_PRINT, size, flags, pc); 1222 event = trace_buffer_lock_reserve(tr, TRACE_BPRINT, size, flags, pc);
1223 if (!event) 1223 if (!event)
1224 goto out_unlock; 1224 goto out_unlock;
1225 entry = ring_buffer_event_data(event); 1225 entry = ring_buffer_event_data(event);
@@ -1240,6 +1240,60 @@ out:
1240 1240
1241 return len; 1241 return len;
1242} 1242}
1243EXPORT_SYMBOL_GPL(trace_vbprintk);
1244
1245int trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args)
1246{
1247 static raw_spinlock_t trace_buf_lock = __RAW_SPIN_LOCK_UNLOCKED;
1248 static char trace_buf[TRACE_BUF_SIZE];
1249
1250 struct ring_buffer_event *event;
1251 struct trace_array *tr = &global_trace;
1252 struct trace_array_cpu *data;
1253 int cpu, len = 0, size, pc;
1254 struct print_entry *entry;
1255 unsigned long irq_flags;
1256
1257 if (tracing_disabled || tracing_selftest_running)
1258 return 0;
1259
1260 pc = preempt_count();
1261 preempt_disable_notrace();
1262 cpu = raw_smp_processor_id();
1263 data = tr->data[cpu];
1264
1265 if (unlikely(atomic_read(&data->disabled)))
1266 goto out;
1267
1268 pause_graph_tracing();
1269 raw_local_irq_save(irq_flags);
1270 __raw_spin_lock(&trace_buf_lock);
1271 len = vsnprintf(trace_buf, TRACE_BUF_SIZE, fmt, args);
1272
1273 len = min(len, TRACE_BUF_SIZE-1);
1274 trace_buf[len] = 0;
1275
1276 size = sizeof(*entry) + len + 1;
1277 event = trace_buffer_lock_reserve(tr, TRACE_PRINT, size, irq_flags, pc);
1278 if (!event)
1279 goto out_unlock;
1280 entry = ring_buffer_event_data(event);
1281 entry->ip = ip;
1282 entry->depth = depth;
1283
1284 memcpy(&entry->buf, trace_buf, len);
1285 entry->buf[len] = 0;
1286 ring_buffer_unlock_commit(tr->buffer, event);
1287
1288 out_unlock:
1289 __raw_spin_unlock(&trace_buf_lock);
1290 raw_local_irq_restore(irq_flags);
1291 unpause_graph_tracing();
1292 out:
1293 preempt_enable_notrace();
1294
1295 return len;
1296}
1243EXPORT_SYMBOL_GPL(trace_vprintk); 1297EXPORT_SYMBOL_GPL(trace_vprintk);
1244 1298
1245enum trace_file_type { 1299enum trace_file_type {
@@ -1628,6 +1682,22 @@ static enum print_line_t print_hex_fmt(struct trace_iterator *iter)
1628 return TRACE_TYPE_HANDLED; 1682 return TRACE_TYPE_HANDLED;
1629} 1683}
1630 1684
1685static enum print_line_t print_bprintk_msg_only(struct trace_iterator *iter)
1686{
1687 struct trace_seq *s = &iter->seq;
1688 struct trace_entry *entry = iter->ent;
1689 struct bprint_entry *field;
1690 int ret;
1691
1692 trace_assign_type(field, entry);
1693
1694 ret = trace_seq_bprintf(s, field->fmt, field->buf);
1695 if (!ret)
1696 return TRACE_TYPE_PARTIAL_LINE;
1697
1698 return TRACE_TYPE_HANDLED;
1699}
1700
1631static enum print_line_t print_printk_msg_only(struct trace_iterator *iter) 1701static enum print_line_t print_printk_msg_only(struct trace_iterator *iter)
1632{ 1702{
1633 struct trace_seq *s = &iter->seq; 1703 struct trace_seq *s = &iter->seq;
@@ -1637,7 +1707,7 @@ static enum print_line_t print_printk_msg_only(struct trace_iterator *iter)
1637 1707
1638 trace_assign_type(field, entry); 1708 trace_assign_type(field, entry);
1639 1709
1640 ret = trace_seq_bprintf(s, field->fmt, field->buf); 1710 ret = trace_seq_printf(s, "%s", field->buf);
1641 if (!ret) 1711 if (!ret)
1642 return TRACE_TYPE_PARTIAL_LINE; 1712 return TRACE_TYPE_PARTIAL_LINE;
1643 1713
@@ -1702,6 +1772,11 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
1702 return ret; 1772 return ret;
1703 } 1773 }
1704 1774
1775 if (iter->ent->type == TRACE_BPRINT &&
1776 trace_flags & TRACE_ITER_PRINTK &&
1777 trace_flags & TRACE_ITER_PRINTK_MSGONLY)
1778 return print_bprintk_msg_only(iter);
1779
1705 if (iter->ent->type == TRACE_PRINT && 1780 if (iter->ent->type == TRACE_PRINT &&
1706 trace_flags & TRACE_ITER_PRINTK && 1781 trace_flags & TRACE_ITER_PRINTK &&
1707 trace_flags & TRACE_ITER_PRINTK_MSGONLY) 1782 trace_flags & TRACE_ITER_PRINTK_MSGONLY)
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 336324d717f8..cede1ab49d07 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -20,6 +20,7 @@ enum trace_type {
20 TRACE_WAKE, 20 TRACE_WAKE,
21 TRACE_STACK, 21 TRACE_STACK,
22 TRACE_PRINT, 22 TRACE_PRINT,
23 TRACE_BPRINT,
23 TRACE_SPECIAL, 24 TRACE_SPECIAL,
24 TRACE_MMIO_RW, 25 TRACE_MMIO_RW,
25 TRACE_MMIO_MAP, 26 TRACE_MMIO_MAP,
@@ -117,7 +118,7 @@ struct userstack_entry {
117/* 118/*
118 * trace_printk entry: 119 * trace_printk entry:
119 */ 120 */
120struct print_entry { 121struct bprint_entry {
121 struct trace_entry ent; 122 struct trace_entry ent;
122 unsigned long ip; 123 unsigned long ip;
123 int depth; 124 int depth;
@@ -125,6 +126,13 @@ struct print_entry {
125 u32 buf[]; 126 u32 buf[];
126}; 127};
127 128
129struct print_entry {
130 struct trace_entry ent;
131 unsigned long ip;
132 int depth;
133 char buf[];
134};
135
128#define TRACE_OLD_SIZE 88 136#define TRACE_OLD_SIZE 88
129 137
130struct trace_field_cont { 138struct trace_field_cont {
@@ -286,6 +294,7 @@ extern void __ftrace_bad_type(void);
286 IF_ASSIGN(var, ent, struct stack_entry, TRACE_STACK); \ 294 IF_ASSIGN(var, ent, struct stack_entry, TRACE_STACK); \
287 IF_ASSIGN(var, ent, struct userstack_entry, TRACE_USER_STACK);\ 295 IF_ASSIGN(var, ent, struct userstack_entry, TRACE_USER_STACK);\
288 IF_ASSIGN(var, ent, struct print_entry, TRACE_PRINT); \ 296 IF_ASSIGN(var, ent, struct print_entry, TRACE_PRINT); \
297 IF_ASSIGN(var, ent, struct bprint_entry, TRACE_BPRINT); \
289 IF_ASSIGN(var, ent, struct special_entry, 0); \ 298 IF_ASSIGN(var, ent, struct special_entry, 0); \
290 IF_ASSIGN(var, ent, struct trace_mmiotrace_rw, \ 299 IF_ASSIGN(var, ent, struct trace_mmiotrace_rw, \
291 TRACE_MMIO_RW); \ 300 TRACE_MMIO_RW); \
@@ -570,6 +579,8 @@ extern int trace_selftest_startup_branch(struct tracer *trace,
570extern void *head_page(struct trace_array_cpu *data); 579extern void *head_page(struct trace_array_cpu *data);
571extern long ns2usecs(cycle_t nsec); 580extern long ns2usecs(cycle_t nsec);
572extern int 581extern int
582trace_vbprintk(unsigned long ip, int depth, const char *fmt, va_list args);
583extern int
573trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args); 584trace_vprintk(unsigned long ip, int depth, const char *fmt, va_list args);
574 585
575extern unsigned long trace_flags; 586extern unsigned long trace_flags;
diff --git a/kernel/trace/trace_event_types.h b/kernel/trace/trace_event_types.h
index 5cca4c978bde..d0907d746425 100644
--- a/kernel/trace/trace_event_types.h
+++ b/kernel/trace/trace_event_types.h
@@ -102,7 +102,7 @@ TRACE_EVENT_FORMAT(user_stack, TRACE_USER_STACK, userstack_entry, ignore,
102 "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n") 102 "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n")
103); 103);
104 104
105TRACE_EVENT_FORMAT(print, TRACE_PRINT, print_entry, ignore, 105TRACE_EVENT_FORMAT(bprint, TRACE_PRINT, bprint_entry, ignore,
106 TRACE_STRUCT( 106 TRACE_STRUCT(
107 TRACE_FIELD(unsigned long, ip, ip) 107 TRACE_FIELD(unsigned long, ip, ip)
108 TRACE_FIELD(unsigned int, depth, depth) 108 TRACE_FIELD(unsigned int, depth, depth)
@@ -112,6 +112,15 @@ TRACE_EVENT_FORMAT(print, TRACE_PRINT, print_entry, ignore,
112 TP_RAW_FMT("%08lx (%d) fmt:%p %s") 112 TP_RAW_FMT("%08lx (%d) fmt:%p %s")
113); 113);
114 114
115TRACE_EVENT_FORMAT(print, TRACE_PRINT, print_entry, ignore,
116 TRACE_STRUCT(
117 TRACE_FIELD(unsigned long, ip, ip)
118 TRACE_FIELD(unsigned int, depth, depth)
119 TRACE_FIELD_ZERO_CHAR(buf)
120 ),
121 TP_RAW_FMT("%08lx (%d) fmt:%p %s")
122);
123
115TRACE_EVENT_FORMAT(branch, TRACE_BRANCH, trace_branch, ignore, 124TRACE_EVENT_FORMAT(branch, TRACE_BRANCH, trace_branch, ignore,
116 TRACE_STRUCT( 125 TRACE_STRUCT(
117 TRACE_FIELD(unsigned int, line, line) 126 TRACE_FIELD(unsigned int, line, line)
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index 8566c14b3e9a..4c388607ed67 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -684,7 +684,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
684} 684}
685 685
686static enum print_line_t 686static enum print_line_t
687print_graph_comment(struct print_entry *trace, struct trace_seq *s, 687print_graph_comment(struct bprint_entry *trace, struct trace_seq *s,
688 struct trace_entry *ent, struct trace_iterator *iter) 688 struct trace_entry *ent, struct trace_iterator *iter)
689{ 689{
690 int i; 690 int i;
@@ -781,8 +781,8 @@ print_graph_function(struct trace_iterator *iter)
781 trace_assign_type(field, entry); 781 trace_assign_type(field, entry);
782 return print_graph_return(&field->ret, s, entry, iter); 782 return print_graph_return(&field->ret, s, entry, iter);
783 } 783 }
784 case TRACE_PRINT: { 784 case TRACE_BPRINT: {
785 struct print_entry *field; 785 struct bprint_entry *field;
786 trace_assign_type(field, entry); 786 trace_assign_type(field, entry);
787 return print_graph_comment(field, s, entry, iter); 787 return print_graph_comment(field, s, entry, iter);
788 } 788 }
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c
index 23e346a734ca..f095916e477f 100644
--- a/kernel/trace/trace_mmiotrace.c
+++ b/kernel/trace/trace_mmiotrace.c
@@ -254,6 +254,7 @@ static enum print_line_t mmio_print_mark(struct trace_iterator *iter)
254{ 254{
255 struct trace_entry *entry = iter->ent; 255 struct trace_entry *entry = iter->ent;
256 struct print_entry *print = (struct print_entry *)entry; 256 struct print_entry *print = (struct print_entry *)entry;
257 const char *msg = print->buf;
257 struct trace_seq *s = &iter->seq; 258 struct trace_seq *s = &iter->seq;
258 unsigned long long t = ns2usecs(iter->ts); 259 unsigned long long t = ns2usecs(iter->ts);
259 unsigned long usec_rem = do_div(t, USEC_PER_SEC); 260 unsigned long usec_rem = do_div(t, USEC_PER_SEC);
@@ -261,11 +262,7 @@ static enum print_line_t mmio_print_mark(struct trace_iterator *iter)
261 int ret; 262 int ret;
262 263
263 /* The trailing newline must be in the message. */ 264 /* The trailing newline must be in the message. */
264 ret = trace_seq_printf(s, "MARK %u.%06lu ", secs, usec_rem); 265 ret = trace_seq_printf(s, "MARK %u.%06lu %s", secs, usec_rem, msg);
265 if (!ret)
266 return TRACE_TYPE_PARTIAL_LINE;
267
268 ret = trace_seq_bprintf(s, print->fmt, print->buf);
269 if (!ret) 266 if (!ret)
270 return TRACE_TYPE_PARTIAL_LINE; 267 return TRACE_TYPE_PARTIAL_LINE;
271 268
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
index 491832af9ba1..ea9d3b410c7a 100644
--- a/kernel/trace/trace_output.c
+++ b/kernel/trace/trace_output.c
@@ -832,13 +832,13 @@ static struct trace_event trace_user_stack_event = {
832 .binary = trace_special_bin, 832 .binary = trace_special_bin,
833}; 833};
834 834
835/* TRACE_PRINT */ 835/* TRACE_BPRINT */
836static enum print_line_t 836static enum print_line_t
837trace_print_print(struct trace_iterator *iter, int flags) 837trace_bprint_print(struct trace_iterator *iter, int flags)
838{ 838{
839 struct trace_entry *entry = iter->ent; 839 struct trace_entry *entry = iter->ent;
840 struct trace_seq *s = &iter->seq; 840 struct trace_seq *s = &iter->seq;
841 struct print_entry *field; 841 struct bprint_entry *field;
842 842
843 trace_assign_type(field, entry); 843 trace_assign_type(field, entry);
844 844
@@ -858,9 +858,10 @@ trace_print_print(struct trace_iterator *iter, int flags)
858} 858}
859 859
860 860
861static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags) 861static enum print_line_t
862trace_bprint_raw(struct trace_iterator *iter, int flags)
862{ 863{
863 struct print_entry *field; 864 struct bprint_entry *field;
864 struct trace_seq *s = &iter->seq; 865 struct trace_seq *s = &iter->seq;
865 866
866 trace_assign_type(field, iter->ent); 867 trace_assign_type(field, iter->ent);
@@ -878,12 +879,55 @@ static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags)
878} 879}
879 880
880 881
882static struct trace_event trace_bprint_event = {
883 .type = TRACE_BPRINT,
884 .trace = trace_bprint_print,
885 .raw = trace_bprint_raw,
886};
887
888/* TRACE_PRINT */
889static enum print_line_t trace_print_print(struct trace_iterator *iter,
890 int flags)
891{
892 struct print_entry *field;
893 struct trace_seq *s = &iter->seq;
894
895 trace_assign_type(field, iter->ent);
896
897 if (!seq_print_ip_sym(s, field->ip, flags))
898 goto partial;
899
900 if (!trace_seq_printf(s, ": %s", field->buf))
901 goto partial;
902
903 return TRACE_TYPE_HANDLED;
904
905 partial:
906 return TRACE_TYPE_PARTIAL_LINE;
907}
908
909static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags)
910{
911 struct print_entry *field;
912
913 trace_assign_type(field, iter->ent);
914
915 if (!trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf))
916 goto partial;
917
918 return TRACE_TYPE_HANDLED;
919
920 partial:
921 return TRACE_TYPE_PARTIAL_LINE;
922}
923
881static struct trace_event trace_print_event = { 924static struct trace_event trace_print_event = {
882 .type = TRACE_PRINT, 925 .type = TRACE_PRINT,
883 .trace = trace_print_print, 926 .trace = trace_print_print,
884 .raw = trace_print_raw, 927 .raw = trace_print_raw,
885}; 928};
886 929
930
887static struct trace_event *events[] __initdata = { 931static struct trace_event *events[] __initdata = {
888 &trace_fn_event, 932 &trace_fn_event,
889 &trace_ctx_event, 933 &trace_ctx_event,
@@ -891,6 +935,7 @@ static struct trace_event *events[] __initdata = {
891 &trace_special_event, 935 &trace_special_event,
892 &trace_stack_event, 936 &trace_stack_event,
893 &trace_user_stack_event, 937 &trace_user_stack_event,
938 &trace_bprint_event,
894 &trace_print_event, 939 &trace_print_event,
895 NULL 940 NULL
896}; 941};
diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
index a50aea22e929..f307a11e2332 100644
--- a/kernel/trace/trace_printk.c
+++ b/kernel/trace/trace_printk.c
@@ -99,7 +99,7 @@ struct notifier_block module_trace_bprintk_format_nb = {
99 .notifier_call = module_trace_bprintk_format_notify, 99 .notifier_call = module_trace_bprintk_format_notify,
100}; 100};
101 101
102int __trace_printk(unsigned long ip, const char *fmt, ...) 102int __trace_bprintk(unsigned long ip, const char *fmt, ...)
103 { 103 {
104 int ret; 104 int ret;
105 va_list ap; 105 va_list ap;
@@ -111,13 +111,13 @@ int __trace_printk(unsigned long ip, const char *fmt, ...)
111 return 0; 111 return 0;
112 112
113 va_start(ap, fmt); 113 va_start(ap, fmt);
114 ret = trace_vprintk(ip, task_curr_ret_stack(current), fmt, ap); 114 ret = trace_vbprintk(ip, task_curr_ret_stack(current), fmt, ap);
115 va_end(ap); 115 va_end(ap);
116 return ret; 116 return ret;
117} 117}
118EXPORT_SYMBOL_GPL(__trace_printk); 118EXPORT_SYMBOL_GPL(__trace_bprintk);
119 119
120int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap) 120int __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap)
121 { 121 {
122 if (unlikely(!fmt)) 122 if (unlikely(!fmt))
123 return 0; 123 return 0;
@@ -125,11 +125,34 @@ int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap)
125 if (!(trace_flags & TRACE_ITER_PRINTK)) 125 if (!(trace_flags & TRACE_ITER_PRINTK))
126 return 0; 126 return 0;
127 127
128 return trace_vbprintk(ip, task_curr_ret_stack(current), fmt, ap);
129}
130EXPORT_SYMBOL_GPL(__ftrace_vbprintk);
131
132int __trace_printk(unsigned long ip, const char *fmt, ...)
133{
134 int ret;
135 va_list ap;
136
137 if (!(trace_flags & TRACE_ITER_PRINTK))
138 return 0;
139
140 va_start(ap, fmt);
141 ret = trace_vprintk(ip, task_curr_ret_stack(current), fmt, ap);
142 va_end(ap);
143 return ret;
144}
145EXPORT_SYMBOL_GPL(__trace_printk);
146
147int __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap)
148{
149 if (!(trace_flags & TRACE_ITER_PRINTK))
150 return 0;
151
128 return trace_vprintk(ip, task_curr_ret_stack(current), fmt, ap); 152 return trace_vprintk(ip, task_curr_ret_stack(current), fmt, ap);
129} 153}
130EXPORT_SYMBOL_GPL(__ftrace_vprintk); 154EXPORT_SYMBOL_GPL(__ftrace_vprintk);
131 155
132
133static __init int init_trace_printk(void) 156static __init int init_trace_printk(void)
134{ 157{
135 return register_module_notifier(&module_trace_bprintk_format_nb); 158 return register_module_notifier(&module_trace_bprintk_format_nb);