@@ -482,15 +482,15 @@ EXPORT_SYMBOL_GPL(unregister_ftrace_export);
482
482
TRACE_ITER_ANNOTATE | TRACE_ITER_CONTEXT_INFO | \
483
483
TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE | \
484
484
TRACE_ITER_IRQ_INFO | TRACE_ITER_MARKERS | \
485
- TRACE_ITER_HASH_PTR)
485
+ TRACE_ITER_HASH_PTR | TRACE_ITER_TRACE_PRINTK )
486
486
487
487
/* trace_options that are only supported by global_trace */
488
488
#define TOP_LEVEL_TRACE_FLAGS (TRACE_ITER_PRINTK | \
489
489
TRACE_ITER_PRINTK_MSGONLY | TRACE_ITER_RECORD_CMD)
490
490
491
491
/* trace_flags that are default zero for instances */
492
492
#define ZEROED_TRACE_FLAGS \
493
- (TRACE_ITER_EVENT_FORK | TRACE_ITER_FUNC_FORK)
493
+ (TRACE_ITER_EVENT_FORK | TRACE_ITER_FUNC_FORK | TRACE_ITER_TRACE_PRINTK )
494
494
495
495
/*
496
496
* The global_trace is the descriptor that holds the top-level tracing
@@ -513,6 +513,16 @@ static __always_inline bool printk_binsafe(struct trace_array *tr)
513
513
return !(tr -> flags & TRACE_ARRAY_FL_BOOT );
514
514
}
515
515
516
+ static void update_printk_trace (struct trace_array * tr )
517
+ {
518
+ if (printk_trace == tr )
519
+ return ;
520
+
521
+ printk_trace -> trace_flags &= ~TRACE_ITER_TRACE_PRINTK ;
522
+ printk_trace = tr ;
523
+ tr -> trace_flags |= TRACE_ITER_TRACE_PRINTK ;
524
+ }
525
+
516
526
void trace_set_ring_buffer_expanded (struct trace_array * tr )
517
527
{
518
528
if (!tr )
@@ -5300,7 +5310,8 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
5300
5310
int set_tracer_flag (struct trace_array * tr , unsigned int mask , int enabled )
5301
5311
{
5302
5312
if ((mask == TRACE_ITER_RECORD_TGID ) ||
5303
- (mask == TRACE_ITER_RECORD_CMD ))
5313
+ (mask == TRACE_ITER_RECORD_CMD ) ||
5314
+ (mask == TRACE_ITER_TRACE_PRINTK ))
5304
5315
lockdep_assert_held (& event_mutex );
5305
5316
5306
5317
/* do nothing if flag is already set */
@@ -5312,6 +5323,25 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
5312
5323
if (tr -> current_trace -> flag_changed (tr , mask , !!enabled ))
5313
5324
return - EINVAL ;
5314
5325
5326
+ if (mask == TRACE_ITER_TRACE_PRINTK ) {
5327
+ if (enabled ) {
5328
+ update_printk_trace (tr );
5329
+ } else {
5330
+ /*
5331
+ * The global_trace cannot clear this.
5332
+ * It's flag only gets cleared if another instance sets it.
5333
+ */
5334
+ if (printk_trace == & global_trace )
5335
+ return - EINVAL ;
5336
+ /*
5337
+ * An instance must always have it set.
5338
+ * by default, that's the global_trace instane.
5339
+ */
5340
+ if (printk_trace == tr )
5341
+ update_printk_trace (& global_trace );
5342
+ }
5343
+ }
5344
+
5315
5345
if (enabled )
5316
5346
tr -> trace_flags |= mask ;
5317
5347
else
@@ -9687,7 +9717,7 @@ static int __remove_instance(struct trace_array *tr)
9687
9717
}
9688
9718
9689
9719
if (printk_trace == tr )
9690
- printk_trace = & global_trace ;
9720
+ update_printk_trace ( & global_trace ) ;
9691
9721
9692
9722
tracing_set_nop (tr );
9693
9723
clear_ftrace_function_probes (tr );
@@ -10578,7 +10608,7 @@ __init static void enable_instances(void)
10578
10608
tracer_tracing_off (tr );
10579
10609
10580
10610
if (traceprintk )
10581
- printk_trace = tr ;
10611
+ update_printk_trace ( tr ) ;
10582
10612
10583
10613
/*
10584
10614
* If start is set, then this is a mapped buffer, and
0 commit comments