@@ -597,8 +597,13 @@ static void stop_irqsoff_tracer(struct trace_array *tr, int graph)
597
597
unregister_irqsoff_function (tr , graph );
598
598
}
599
599
600
- static void __irqsoff_tracer_init (struct trace_array * tr )
600
+ static bool irqsoff_busy ;
601
+
602
+ static int __irqsoff_tracer_init (struct trace_array * tr )
601
603
{
604
+ if (irqsoff_busy )
605
+ return - EBUSY ;
606
+
602
607
save_flags = trace_flags ;
603
608
604
609
/* non overwrite screws up the latency tracers */
@@ -617,6 +622,9 @@ static void __irqsoff_tracer_init(struct trace_array *tr)
617
622
if (start_irqsoff_tracer (tr , (tr -> flags & TRACE_ARRAY_FL_GLOBAL &&
618
623
is_graph ())))
619
624
printk (KERN_ERR "failed to start irqsoff tracer\n" );
625
+
626
+ irqsoff_busy = true;
627
+ return 0 ;
620
628
}
621
629
622
630
static void irqsoff_tracer_reset (struct trace_array * tr )
@@ -629,6 +637,8 @@ static void irqsoff_tracer_reset(struct trace_array *tr)
629
637
set_tracer_flag (tr , TRACE_ITER_LATENCY_FMT , lat_flag );
630
638
set_tracer_flag (tr , TRACE_ITER_OVERWRITE , overwrite_flag );
631
639
ftrace_reset_array_ops (tr );
640
+
641
+ irqsoff_busy = false;
632
642
}
633
643
634
644
static void irqsoff_tracer_start (struct trace_array * tr )
@@ -646,8 +656,7 @@ static int irqsoff_tracer_init(struct trace_array *tr)
646
656
{
647
657
trace_type = TRACER_IRQS_OFF ;
648
658
649
- __irqsoff_tracer_init (tr );
650
- return 0 ;
659
+ return __irqsoff_tracer_init (tr );
651
660
}
652
661
static struct tracer irqsoff_tracer __read_mostly =
653
662
{
@@ -667,6 +676,7 @@ static struct tracer irqsoff_tracer __read_mostly =
667
676
#endif
668
677
.open = irqsoff_trace_open ,
669
678
.close = irqsoff_trace_close ,
679
+ .allow_instances = true,
670
680
.use_max_tr = true,
671
681
};
672
682
# define register_irqsoff (trace ) register_tracer(&trace)
@@ -679,8 +689,7 @@ static int preemptoff_tracer_init(struct trace_array *tr)
679
689
{
680
690
trace_type = TRACER_PREEMPT_OFF ;
681
691
682
- __irqsoff_tracer_init (tr );
683
- return 0 ;
692
+ return __irqsoff_tracer_init (tr );
684
693
}
685
694
686
695
static struct tracer preemptoff_tracer __read_mostly =
@@ -701,6 +710,7 @@ static struct tracer preemptoff_tracer __read_mostly =
701
710
#endif
702
711
.open = irqsoff_trace_open ,
703
712
.close = irqsoff_trace_close ,
713
+ .allow_instances = true,
704
714
.use_max_tr = true,
705
715
};
706
716
# define register_preemptoff (trace ) register_tracer(&trace)
@@ -715,8 +725,7 @@ static int preemptirqsoff_tracer_init(struct trace_array *tr)
715
725
{
716
726
trace_type = TRACER_IRQS_OFF | TRACER_PREEMPT_OFF ;
717
727
718
- __irqsoff_tracer_init (tr );
719
- return 0 ;
728
+ return __irqsoff_tracer_init (tr );
720
729
}
721
730
722
731
static struct tracer preemptirqsoff_tracer __read_mostly =
@@ -737,6 +746,7 @@ static struct tracer preemptirqsoff_tracer __read_mostly =
737
746
#endif
738
747
.open = irqsoff_trace_open ,
739
748
.close = irqsoff_trace_close ,
749
+ .allow_instances = true,
740
750
.use_max_tr = true,
741
751
};
742
752
0 commit comments