aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace.c38
-rw-r--r--kernel/trace/trace.h1
-rw-r--r--kernel/trace/trace_irqsoff.c3
-rw-r--r--kernel/trace/trace_sched_wakeup.c2
4 files changed, 38 insertions, 6 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index af9042977c08..f7488f44d26b 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -660,6 +660,10 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
660 return; 660 return;
661 661
662 WARN_ON_ONCE(!irqs_disabled()); 662 WARN_ON_ONCE(!irqs_disabled());
663 if (!current_trace->use_max_tr) {
664 WARN_ON_ONCE(1);
665 return;
666 }
663 arch_spin_lock(&ftrace_max_lock); 667 arch_spin_lock(&ftrace_max_lock);
664 668
665 tr->buffer = max_tr.buffer; 669 tr->buffer = max_tr.buffer;
@@ -686,6 +690,11 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
686 return; 690 return;
687 691
688 WARN_ON_ONCE(!irqs_disabled()); 692 WARN_ON_ONCE(!irqs_disabled());
693 if (!current_trace->use_max_tr) {
694 WARN_ON_ONCE(1);
695 return;
696 }
697
689 arch_spin_lock(&ftrace_max_lock); 698 arch_spin_lock(&ftrace_max_lock);
690 699
691 ftrace_disable_cpu(); 700 ftrace_disable_cpu();
@@ -2801,6 +2810,9 @@ static int tracing_resize_ring_buffer(unsigned long size)
2801 if (ret < 0) 2810 if (ret < 0)
2802 return ret; 2811 return ret;
2803 2812
2813 if (!current_trace->use_max_tr)
2814 goto out;
2815
2804 ret = ring_buffer_resize(max_tr.buffer, size); 2816 ret = ring_buffer_resize(max_tr.buffer, size);
2805 if (ret < 0) { 2817 if (ret < 0) {
2806 int r; 2818 int r;
@@ -2828,11 +2840,14 @@ static int tracing_resize_ring_buffer(unsigned long size)
2828 return ret; 2840 return ret;
2829 } 2841 }
2830 2842
2843 max_tr.entries = size;
2844 out:
2831 global_trace.entries = size; 2845 global_trace.entries = size;
2832 2846
2833 return ret; 2847 return ret;
2834} 2848}
2835 2849
2850
2836/** 2851/**
2837 * tracing_update_buffers - used by tracing facility to expand ring buffers 2852 * tracing_update_buffers - used by tracing facility to expand ring buffers
2838 * 2853 *
@@ -2893,12 +2908,26 @@ static int tracing_set_tracer(const char *buf)
2893 trace_branch_disable(); 2908 trace_branch_disable();
2894 if (current_trace && current_trace->reset) 2909 if (current_trace && current_trace->reset)
2895 current_trace->reset(tr); 2910 current_trace->reset(tr);
2896 2911 if (current_trace && current_trace->use_max_tr) {
2912 /*
2913 * We don't free the ring buffer. instead, resize it because
2914 * The max_tr ring buffer has some state (e.g. ring->clock) and
2915 * we want preserve it.
2916 */
2917 ring_buffer_resize(max_tr.buffer, 1);
2918 max_tr.entries = 1;
2919 }
2897 destroy_trace_option_files(topts); 2920 destroy_trace_option_files(topts);
2898 2921
2899 current_trace = t; 2922 current_trace = t;
2900 2923
2901 topts = create_trace_option_files(current_trace); 2924 topts = create_trace_option_files(current_trace);
2925 if (current_trace->use_max_tr) {
2926 ret = ring_buffer_resize(max_tr.buffer, global_trace.entries);
2927 if (ret < 0)
2928 goto out;
2929 max_tr.entries = global_trace.entries;
2930 }
2902 2931
2903 if (t->init) { 2932 if (t->init) {
2904 ret = tracer_init(t, tr); 2933 ret = tracer_init(t, tr);
@@ -3480,7 +3509,6 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
3480 } 3509 }
3481 3510
3482 tracing_start(); 3511 tracing_start();
3483 max_tr.entries = global_trace.entries;
3484 mutex_unlock(&trace_types_lock); 3512 mutex_unlock(&trace_types_lock);
3485 3513
3486 return cnt; 3514 return cnt;
@@ -4578,16 +4606,14 @@ __init static int tracer_alloc_buffers(void)
4578 4606
4579 4607
4580#ifdef CONFIG_TRACER_MAX_TRACE 4608#ifdef CONFIG_TRACER_MAX_TRACE
4581 max_tr.buffer = ring_buffer_alloc(ring_buf_size, 4609 max_tr.buffer = ring_buffer_alloc(1, TRACE_BUFFER_FLAGS);
4582 TRACE_BUFFER_FLAGS);
4583 if (!max_tr.buffer) { 4610 if (!max_tr.buffer) {
4584 printk(KERN_ERR "tracer: failed to allocate max ring buffer!\n"); 4611 printk(KERN_ERR "tracer: failed to allocate max ring buffer!\n");
4585 WARN_ON(1); 4612 WARN_ON(1);
4586 ring_buffer_free(global_trace.buffer); 4613 ring_buffer_free(global_trace.buffer);
4587 goto out_free_cpumask; 4614 goto out_free_cpumask;
4588 } 4615 }
4589 max_tr.entries = ring_buffer_size(max_tr.buffer); 4616 max_tr.entries = 1;
4590 WARN_ON(max_tr.entries != global_trace.entries);
4591#endif 4617#endif
4592 4618
4593 /* Allocate the first page for all buffers */ 4619 /* Allocate the first page for all buffers */
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 7778f067fc8b..cb629b3b108c 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -276,6 +276,7 @@ struct tracer {
276 struct tracer *next; 276 struct tracer *next;
277 int print_max; 277 int print_max;
278 struct tracer_flags *flags; 278 struct tracer_flags *flags;
279 int use_max_tr;
279}; 280};
280 281
281 282
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
index 6fd486e0cef4..73a6b0601f2e 100644
--- a/kernel/trace/trace_irqsoff.c
+++ b/kernel/trace/trace_irqsoff.c
@@ -649,6 +649,7 @@ static struct tracer irqsoff_tracer __read_mostly =
649#endif 649#endif
650 .open = irqsoff_trace_open, 650 .open = irqsoff_trace_open,
651 .close = irqsoff_trace_close, 651 .close = irqsoff_trace_close,
652 .use_max_tr = 1,
652}; 653};
653# define register_irqsoff(trace) register_tracer(&trace) 654# define register_irqsoff(trace) register_tracer(&trace)
654#else 655#else
@@ -681,6 +682,7 @@ static struct tracer preemptoff_tracer __read_mostly =
681#endif 682#endif
682 .open = irqsoff_trace_open, 683 .open = irqsoff_trace_open,
683 .close = irqsoff_trace_close, 684 .close = irqsoff_trace_close,
685 .use_max_tr = 1,
684}; 686};
685# define register_preemptoff(trace) register_tracer(&trace) 687# define register_preemptoff(trace) register_tracer(&trace)
686#else 688#else
@@ -715,6 +717,7 @@ static struct tracer preemptirqsoff_tracer __read_mostly =
715#endif 717#endif
716 .open = irqsoff_trace_open, 718 .open = irqsoff_trace_open,
717 .close = irqsoff_trace_close, 719 .close = irqsoff_trace_close,
720 .use_max_tr = 1,
718}; 721};
719 722
720# define register_preemptirqsoff(trace) register_tracer(&trace) 723# define register_preemptirqsoff(trace) register_tracer(&trace)
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c
index c9fd5bd02036..4086eae6e81b 100644
--- a/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/trace/trace_sched_wakeup.c
@@ -382,6 +382,7 @@ static struct tracer wakeup_tracer __read_mostly =
382#ifdef CONFIG_FTRACE_SELFTEST 382#ifdef CONFIG_FTRACE_SELFTEST
383 .selftest = trace_selftest_startup_wakeup, 383 .selftest = trace_selftest_startup_wakeup,
384#endif 384#endif
385 .use_max_tr = 1,
385}; 386};
386 387
387static struct tracer wakeup_rt_tracer __read_mostly = 388static struct tracer wakeup_rt_tracer __read_mostly =
@@ -396,6 +397,7 @@ static struct tracer wakeup_rt_tracer __read_mostly =
396#ifdef CONFIG_FTRACE_SELFTEST 397#ifdef CONFIG_FTRACE_SELFTEST
397 .selftest = trace_selftest_startup_wakeup, 398 .selftest = trace_selftest_startup_wakeup,
398#endif 399#endif
400 .use_max_tr = 1,
399}; 401};
400 402
401__init static int init_wakeup_tracer(void) 403__init static int init_wakeup_tracer(void)