@@ -500,6 +500,8 @@ static struct trace_array global_trace = {
500
500
.trace_flags = TRACE_DEFAULT_FLAGS ,
501
501
};
502
502
503
+ static struct trace_array * printk_trace = & global_trace ;
504
+
503
505
void trace_set_ring_buffer_expanded (struct trace_array * tr )
504
506
{
505
507
if (!tr )
@@ -1117,7 +1119,7 @@ EXPORT_SYMBOL_GPL(__trace_array_puts);
1117
1119
*/
1118
1120
int __trace_puts (unsigned long ip , const char * str , int size )
1119
1121
{
1120
- return __trace_array_puts (& global_trace , ip , str , size );
1122
+ return __trace_array_puts (printk_trace , ip , str , size );
1121
1123
}
1122
1124
EXPORT_SYMBOL_GPL (__trace_puts );
1123
1125
@@ -1128,21 +1130,22 @@ EXPORT_SYMBOL_GPL(__trace_puts);
1128
1130
*/
1129
1131
int __trace_bputs (unsigned long ip , const char * str )
1130
1132
{
1133
+ struct trace_array * tr = printk_trace ;
1131
1134
struct ring_buffer_event * event ;
1132
1135
struct trace_buffer * buffer ;
1133
1136
struct bputs_entry * entry ;
1134
1137
unsigned int trace_ctx ;
1135
1138
int size = sizeof (struct bputs_entry );
1136
1139
int ret = 0 ;
1137
1140
1138
- if (!(global_trace . trace_flags & TRACE_ITER_PRINTK ))
1141
+ if (!(tr -> trace_flags & TRACE_ITER_PRINTK ))
1139
1142
return 0 ;
1140
1143
1141
1144
if (unlikely (tracing_selftest_running || tracing_disabled ))
1142
1145
return 0 ;
1143
1146
1144
1147
trace_ctx = tracing_gen_ctx ();
1145
- buffer = global_trace . array_buffer .buffer ;
1148
+ buffer = tr -> array_buffer .buffer ;
1146
1149
1147
1150
ring_buffer_nest_start (buffer );
1148
1151
event = __trace_buffer_lock_reserve (buffer , TRACE_BPUTS , size ,
@@ -1155,7 +1158,7 @@ int __trace_bputs(unsigned long ip, const char *str)
1155
1158
entry -> str = str ;
1156
1159
1157
1160
__buffer_unlock_commit (buffer , event );
1158
- ftrace_trace_stack (& global_trace , buffer , trace_ctx , 4 , NULL );
1161
+ ftrace_trace_stack (tr , buffer , trace_ctx , 4 , NULL );
1159
1162
1160
1163
ret = 1 ;
1161
1164
out :
@@ -3025,7 +3028,7 @@ void trace_dump_stack(int skip)
3025
3028
/* Skip 1 to skip this function. */
3026
3029
skip ++ ;
3027
3030
#endif
3028
- __ftrace_trace_stack (global_trace . array_buffer .buffer ,
3031
+ __ftrace_trace_stack (printk_trace -> array_buffer .buffer ,
3029
3032
tracing_gen_ctx (), skip , NULL );
3030
3033
}
3031
3034
EXPORT_SYMBOL_GPL (trace_dump_stack );
@@ -3244,7 +3247,7 @@ int trace_vbprintk(unsigned long ip, const char *fmt, va_list args)
3244
3247
struct trace_event_call * call = & event_bprint ;
3245
3248
struct ring_buffer_event * event ;
3246
3249
struct trace_buffer * buffer ;
3247
- struct trace_array * tr = & global_trace ;
3250
+ struct trace_array * tr = printk_trace ;
3248
3251
struct bprint_entry * entry ;
3249
3252
unsigned int trace_ctx ;
3250
3253
char * tbuffer ;
@@ -3342,7 +3345,7 @@ __trace_array_vprintk(struct trace_buffer *buffer,
3342
3345
memcpy (& entry -> buf , tbuffer , len + 1 );
3343
3346
if (!call_filter_check_discard (call , entry , buffer , event )) {
3344
3347
__buffer_unlock_commit (buffer , event );
3345
- ftrace_trace_stack (& global_trace , buffer , trace_ctx , 6 , NULL );
3348
+ ftrace_trace_stack (printk_trace , buffer , trace_ctx , 6 , NULL );
3346
3349
}
3347
3350
3348
3351
out :
@@ -3438,7 +3441,7 @@ int trace_array_printk_buf(struct trace_buffer *buffer,
3438
3441
int ret ;
3439
3442
va_list ap ;
3440
3443
3441
- if (!(global_trace . trace_flags & TRACE_ITER_PRINTK ))
3444
+ if (!(printk_trace -> trace_flags & TRACE_ITER_PRINTK ))
3442
3445
return 0 ;
3443
3446
3444
3447
va_start (ap , fmt );
@@ -3450,7 +3453,7 @@ int trace_array_printk_buf(struct trace_buffer *buffer,
3450
3453
__printf (2 , 0 )
3451
3454
int trace_vprintk (unsigned long ip , const char * fmt , va_list args )
3452
3455
{
3453
- return trace_array_vprintk (& global_trace , ip , fmt , args );
3456
+ return trace_array_vprintk (printk_trace , ip , fmt , args );
3454
3457
}
3455
3458
EXPORT_SYMBOL_GPL (trace_vprintk );
3456
3459
@@ -9666,6 +9669,9 @@ static int __remove_instance(struct trace_array *tr)
9666
9669
set_tracer_flag (tr , 1 << i , 0 );
9667
9670
}
9668
9671
9672
+ if (printk_trace == tr )
9673
+ printk_trace = & global_trace ;
9674
+
9669
9675
tracing_set_nop (tr );
9670
9676
clear_ftrace_function_probes (tr );
9671
9677
event_trace_del_tracer (tr );
@@ -10468,6 +10474,7 @@ __init static void enable_instances(void)
10468
10474
phys_addr_t start = 0 ;
10469
10475
phys_addr_t size = 0 ;
10470
10476
unsigned long addr = 0 ;
10477
+ bool traceprintk = false;
10471
10478
bool traceoff = false;
10472
10479
char * flag_delim ;
10473
10480
char * addr_delim ;
@@ -10489,11 +10496,16 @@ __init static void enable_instances(void)
10489
10496
char * flag ;
10490
10497
10491
10498
while ((flag = strsep (& flag_delim , "^" ))) {
10492
- if (strcmp (flag , "traceoff" ) == 0 )
10499
+ if (strcmp (flag , "traceoff" ) == 0 ) {
10493
10500
traceoff = true;
10494
- else
10501
+ } else if ((strcmp (flag , "printk" ) == 0 ) ||
10502
+ (strcmp (flag , "traceprintk" ) == 0 ) ||
10503
+ (strcmp (flag , "trace_printk" ) == 0 )) {
10504
+ traceprintk = true;
10505
+ } else {
10495
10506
pr_info ("Tracing: Invalid instance flag '%s' for %s\n" ,
10496
10507
flag , name );
10508
+ }
10497
10509
}
10498
10510
}
10499
10511
@@ -10548,6 +10560,18 @@ __init static void enable_instances(void)
10548
10560
if (traceoff )
10549
10561
tracer_tracing_off (tr );
10550
10562
10563
+ if (traceprintk ) {
10564
+ /*
10565
+ * The binary format of traceprintk can cause a crash if used
10566
+ * by a buffer from another boot. Do not allow it for the
10567
+ * memory mapped ring buffers.
10568
+ */
10569
+ if (start )
10570
+ pr_warn ("Tracing: WARNING: memory mapped ring buffers cannot be used for trace_printk\n" );
10571
+ else
10572
+ printk_trace = tr ;
10573
+ }
10574
+
10551
10575
/* Only allow non mapped buffers to be deleted */
10552
10576
if (!start )
10553
10577
trace_array_put (tr );
0 commit comments