aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace.c561
-rw-r--r--kernel/trace/trace.h21
-rw-r--r--kernel/trace/trace_irqsoff.c8
-rw-r--r--kernel/trace/trace_sched_wakeup.c8
4 files changed, 358 insertions, 240 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 59953aa28845..91fe40905828 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * ring buffer based function tracer 2 * ring buffer based function tracer
3 * 3 *
4 * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com> 4 * Copyright (C) 2007-2012 Steven Rostedt <srostedt@redhat.com>
5 * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com> 5 * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com>
6 * 6 *
7 * Originally taken from the RT patch by: 7 * Originally taken from the RT patch by:
@@ -251,9 +251,6 @@ static unsigned long trace_buf_size = TRACE_BUF_SIZE_DEFAULT;
251/* trace_types holds a link list of available tracers. */ 251/* trace_types holds a link list of available tracers. */
252static struct tracer *trace_types __read_mostly; 252static struct tracer *trace_types __read_mostly;
253 253
254/* current_trace points to the tracer that is currently active */
255static struct tracer *current_trace __read_mostly = &nop_trace;
256
257/* 254/*
258 * trace_types_lock is used to protect the trace_types list. 255 * trace_types_lock is used to protect the trace_types list.
259 */ 256 */
@@ -350,9 +347,6 @@ unsigned long trace_flags = TRACE_ITER_PRINT_PARENT | TRACE_ITER_PRINTK |
350 TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE | 347 TRACE_ITER_GRAPH_TIME | TRACE_ITER_RECORD_CMD | TRACE_ITER_OVERWRITE |
351 TRACE_ITER_IRQ_INFO | TRACE_ITER_MARKERS; 348 TRACE_ITER_IRQ_INFO | TRACE_ITER_MARKERS;
352 349
353static int trace_stop_count;
354static DEFINE_RAW_SPINLOCK(tracing_start_lock);
355
356/** 350/**
357 * trace_wake_up - wake up tasks waiting for trace input 351 * trace_wake_up - wake up tasks waiting for trace input
358 * 352 *
@@ -708,14 +702,14 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
708{ 702{
709 struct ring_buffer *buf; 703 struct ring_buffer *buf;
710 704
711 if (trace_stop_count) 705 if (tr->stop_count)
712 return; 706 return;
713 707
714 WARN_ON_ONCE(!irqs_disabled()); 708 WARN_ON_ONCE(!irqs_disabled());
715 709
716 if (!current_trace->allocated_snapshot) { 710 if (!tr->current_trace->allocated_snapshot) {
717 /* Only the nop tracer should hit this when disabling */ 711 /* Only the nop tracer should hit this when disabling */
718 WARN_ON_ONCE(current_trace != &nop_trace); 712 WARN_ON_ONCE(tr->current_trace != &nop_trace);
719 return; 713 return;
720 } 714 }
721 715
@@ -742,11 +736,11 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
742{ 736{
743 int ret; 737 int ret;
744 738
745 if (trace_stop_count) 739 if (tr->stop_count)
746 return; 740 return;
747 741
748 WARN_ON_ONCE(!irqs_disabled()); 742 WARN_ON_ONCE(!irqs_disabled());
749 if (WARN_ON_ONCE(!current_trace->allocated_snapshot)) 743 if (WARN_ON_ONCE(!tr->current_trace->allocated_snapshot))
750 return; 744 return;
751 745
752 arch_spin_lock(&ftrace_max_lock); 746 arch_spin_lock(&ftrace_max_lock);
@@ -853,8 +847,8 @@ int register_tracer(struct tracer *type)
853 847
854#ifdef CONFIG_FTRACE_STARTUP_TEST 848#ifdef CONFIG_FTRACE_STARTUP_TEST
855 if (type->selftest && !tracing_selftest_disabled) { 849 if (type->selftest && !tracing_selftest_disabled) {
856 struct tracer *saved_tracer = current_trace;
857 struct trace_array *tr = &global_trace; 850 struct trace_array *tr = &global_trace;
851 struct tracer *saved_tracer = tr->current_trace;
858 852
859 /* 853 /*
860 * Run a selftest on this tracer. 854 * Run a selftest on this tracer.
@@ -865,7 +859,7 @@ int register_tracer(struct tracer *type)
865 */ 859 */
866 tracing_reset_online_cpus(tr); 860 tracing_reset_online_cpus(tr);
867 861
868 current_trace = type; 862 tr->current_trace = type;
869 863
870 if (type->use_max_tr) { 864 if (type->use_max_tr) {
871 /* If we expanded the buffers, make sure the max is expanded too */ 865 /* If we expanded the buffers, make sure the max is expanded too */
@@ -879,7 +873,7 @@ int register_tracer(struct tracer *type)
879 pr_info("Testing tracer %s: ", type->name); 873 pr_info("Testing tracer %s: ", type->name);
880 ret = type->selftest(type, tr); 874 ret = type->selftest(type, tr);
881 /* the test is responsible for resetting too */ 875 /* the test is responsible for resetting too */
882 current_trace = saved_tracer; 876 tr->current_trace = saved_tracer;
883 if (ret) { 877 if (ret) {
884 printk(KERN_CONT "FAILED!\n"); 878 printk(KERN_CONT "FAILED!\n");
885 /* Add the warning after printing 'FAILED' */ 879 /* Add the warning after printing 'FAILED' */
@@ -997,7 +991,7 @@ static void trace_init_cmdlines(void)
997 991
998int is_tracing_stopped(void) 992int is_tracing_stopped(void)
999{ 993{
1000 return trace_stop_count; 994 return global_trace.stop_count;
1001} 995}
1002 996
1003/** 997/**
@@ -1029,12 +1023,12 @@ void tracing_start(void)
1029 if (tracing_disabled) 1023 if (tracing_disabled)
1030 return; 1024 return;
1031 1025
1032 raw_spin_lock_irqsave(&tracing_start_lock, flags); 1026 raw_spin_lock_irqsave(&global_trace.start_lock, flags);
1033 if (--trace_stop_count) { 1027 if (--global_trace.stop_count) {
1034 if (trace_stop_count < 0) { 1028 if (global_trace.stop_count < 0) {
1035 /* Someone screwed up their debugging */ 1029 /* Someone screwed up their debugging */
1036 WARN_ON_ONCE(1); 1030 WARN_ON_ONCE(1);
1037 trace_stop_count = 0; 1031 global_trace.stop_count = 0;
1038 } 1032 }
1039 goto out; 1033 goto out;
1040 } 1034 }
@@ -1054,7 +1048,38 @@ void tracing_start(void)
1054 1048
1055 ftrace_start(); 1049 ftrace_start();
1056 out: 1050 out:
1057 raw_spin_unlock_irqrestore(&tracing_start_lock, flags); 1051 raw_spin_unlock_irqrestore(&global_trace.start_lock, flags);
1052}
1053
1054static void tracing_start_tr(struct trace_array *tr)
1055{
1056 struct ring_buffer *buffer;
1057 unsigned long flags;
1058
1059 if (tracing_disabled)
1060 return;
1061
1062 /* If global, we need to also start the max tracer */
1063 if (tr->flags & TRACE_ARRAY_FL_GLOBAL)
1064 return tracing_start();
1065
1066 raw_spin_lock_irqsave(&tr->start_lock, flags);
1067
1068 if (--tr->stop_count) {
1069 if (tr->stop_count < 0) {
1070 /* Someone screwed up their debugging */
1071 WARN_ON_ONCE(1);
1072 tr->stop_count = 0;
1073 }
1074 goto out;
1075 }
1076
1077 buffer = tr->buffer;
1078 if (buffer)
1079 ring_buffer_record_enable(buffer);
1080
1081 out:
1082 raw_spin_unlock_irqrestore(&tr->start_lock, flags);
1058} 1083}
1059 1084
1060/** 1085/**
@@ -1069,8 +1094,8 @@ void tracing_stop(void)
1069 unsigned long flags; 1094 unsigned long flags;
1070 1095
1071 ftrace_stop(); 1096 ftrace_stop();
1072 raw_spin_lock_irqsave(&tracing_start_lock, flags); 1097 raw_spin_lock_irqsave(&global_trace.start_lock, flags);
1073 if (trace_stop_count++) 1098 if (global_trace.stop_count++)
1074 goto out; 1099 goto out;
1075 1100
1076 /* Prevent the buffers from switching */ 1101 /* Prevent the buffers from switching */
@@ -1087,7 +1112,28 @@ void tracing_stop(void)
1087 arch_spin_unlock(&ftrace_max_lock); 1112 arch_spin_unlock(&ftrace_max_lock);
1088 1113
1089 out: 1114 out:
1090 raw_spin_unlock_irqrestore(&tracing_start_lock, flags); 1115 raw_spin_unlock_irqrestore(&global_trace.start_lock, flags);
1116}
1117
1118static void tracing_stop_tr(struct trace_array *tr)
1119{
1120 struct ring_buffer *buffer;
1121 unsigned long flags;
1122
1123 /* If global, we need to also stop the max tracer */
1124 if (tr->flags & TRACE_ARRAY_FL_GLOBAL)
1125 return tracing_stop();
1126
1127 raw_spin_lock_irqsave(&tr->start_lock, flags);
1128 if (tr->stop_count++)
1129 goto out;
1130
1131 buffer = tr->buffer;
1132 if (buffer)
1133 ring_buffer_record_disable(buffer);
1134
1135 out:
1136 raw_spin_unlock_irqrestore(&tr->start_lock, flags);
1091} 1137}
1092 1138
1093void trace_stop_cmdline_recording(void); 1139void trace_stop_cmdline_recording(void);
@@ -1956,6 +2002,7 @@ void tracing_iter_reset(struct trace_iterator *iter, int cpu)
1956static void *s_start(struct seq_file *m, loff_t *pos) 2002static void *s_start(struct seq_file *m, loff_t *pos)
1957{ 2003{
1958 struct trace_iterator *iter = m->private; 2004 struct trace_iterator *iter = m->private;
2005 struct trace_array *tr = iter->tr;
1959 int cpu_file = iter->cpu_file; 2006 int cpu_file = iter->cpu_file;
1960 void *p = NULL; 2007 void *p = NULL;
1961 loff_t l = 0; 2008 loff_t l = 0;
@@ -1968,8 +2015,8 @@ static void *s_start(struct seq_file *m, loff_t *pos)
1968 * will point to the same string as current_trace->name. 2015 * will point to the same string as current_trace->name.
1969 */ 2016 */
1970 mutex_lock(&trace_types_lock); 2017 mutex_lock(&trace_types_lock);
1971 if (unlikely(current_trace && iter->trace->name != current_trace->name)) 2018 if (unlikely(tr->current_trace && iter->trace->name != tr->current_trace->name))
1972 *iter->trace = *current_trace; 2019 *iter->trace = *tr->current_trace;
1973 mutex_unlock(&trace_types_lock); 2020 mutex_unlock(&trace_types_lock);
1974 2021
1975 if (iter->snapshot && iter->trace->use_max_tr) 2022 if (iter->snapshot && iter->trace->use_max_tr)
@@ -2099,7 +2146,7 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter)
2099 unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK); 2146 unsigned long sym_flags = (trace_flags & TRACE_ITER_SYM_MASK);
2100 struct trace_array *tr = iter->tr; 2147 struct trace_array *tr = iter->tr;
2101 struct trace_array_cpu *data = tr->data[tr->cpu]; 2148 struct trace_array_cpu *data = tr->data[tr->cpu];
2102 struct tracer *type = current_trace; 2149 struct tracer *type = iter->trace;
2103 unsigned long entries; 2150 unsigned long entries;
2104 unsigned long total; 2151 unsigned long total;
2105 const char *name = "preemption"; 2152 const char *name = "preemption";
@@ -2478,7 +2525,8 @@ static const struct seq_operations tracer_seq_ops = {
2478static struct trace_iterator * 2525static struct trace_iterator *
2479__tracing_open(struct inode *inode, struct file *file, bool snapshot) 2526__tracing_open(struct inode *inode, struct file *file, bool snapshot)
2480{ 2527{
2481 long cpu_file = (long) inode->i_private; 2528 struct trace_cpu *tc = inode->i_private;
2529 struct trace_array *tr = tc->tr;
2482 struct trace_iterator *iter; 2530 struct trace_iterator *iter;
2483 int cpu; 2531 int cpu;
2484 2532
@@ -2503,19 +2551,20 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
2503 if (!iter->trace) 2551 if (!iter->trace)
2504 goto fail; 2552 goto fail;
2505 2553
2506 *iter->trace = *current_trace; 2554 *iter->trace = *tr->current_trace;
2507 2555
2508 if (!zalloc_cpumask_var(&iter->started, GFP_KERNEL)) 2556 if (!zalloc_cpumask_var(&iter->started, GFP_KERNEL))
2509 goto fail; 2557 goto fail;
2510 2558
2511 if (current_trace->print_max || snapshot) 2559 /* Currently only the top directory has a snapshot */
2560 if (tr->current_trace->print_max || snapshot)
2512 iter->tr = &max_tr; 2561 iter->tr = &max_tr;
2513 else 2562 else
2514 iter->tr = &global_trace; 2563 iter->tr = tr;
2515 iter->snapshot = snapshot; 2564 iter->snapshot = snapshot;
2516 iter->pos = -1; 2565 iter->pos = -1;
2517 mutex_init(&iter->mutex); 2566 mutex_init(&iter->mutex);
2518 iter->cpu_file = cpu_file; 2567 iter->cpu_file = tc->cpu;
2519 2568
2520 /* Notify the tracer early; before we stop tracing. */ 2569 /* Notify the tracer early; before we stop tracing. */
2521 if (iter->trace && iter->trace->open) 2570 if (iter->trace && iter->trace->open)
@@ -2531,7 +2580,7 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot)
2531 2580
2532 /* stop the trace while dumping if we are not opening "snapshot" */ 2581 /* stop the trace while dumping if we are not opening "snapshot" */
2533 if (!iter->snapshot) 2582 if (!iter->snapshot)
2534 tracing_stop(); 2583 tracing_stop_tr(tr);
2535 2584
2536 if (iter->cpu_file == RING_BUFFER_ALL_CPUS) { 2585 if (iter->cpu_file == RING_BUFFER_ALL_CPUS) {
2537 for_each_tracing_cpu(cpu) { 2586 for_each_tracing_cpu(cpu) {
@@ -2578,6 +2627,7 @@ static int tracing_release(struct inode *inode, struct file *file)
2578{ 2627{
2579 struct seq_file *m = file->private_data; 2628 struct seq_file *m = file->private_data;
2580 struct trace_iterator *iter; 2629 struct trace_iterator *iter;
2630 struct trace_array *tr;
2581 int cpu; 2631 int cpu;
2582 2632
2583 if (!(file->f_mode & FMODE_READ)) 2633 if (!(file->f_mode & FMODE_READ))
@@ -2585,6 +2635,12 @@ static int tracing_release(struct inode *inode, struct file *file)
2585 2635
2586 iter = m->private; 2636 iter = m->private;
2587 2637
2638 /* Only the global tracer has a matching max_tr */
2639 if (iter->tr == &max_tr)
2640 tr = &global_trace;
2641 else
2642 tr = iter->tr;
2643
2588 mutex_lock(&trace_types_lock); 2644 mutex_lock(&trace_types_lock);
2589 for_each_tracing_cpu(cpu) { 2645 for_each_tracing_cpu(cpu) {
2590 if (iter->buffer_iter[cpu]) 2646 if (iter->buffer_iter[cpu])
@@ -2596,7 +2652,7 @@ static int tracing_release(struct inode *inode, struct file *file)
2596 2652
2597 if (!iter->snapshot) 2653 if (!iter->snapshot)
2598 /* reenable tracing if it was previously enabled */ 2654 /* reenable tracing if it was previously enabled */
2599 tracing_start(); 2655 tracing_start_tr(tr);
2600 mutex_unlock(&trace_types_lock); 2656 mutex_unlock(&trace_types_lock);
2601 2657
2602 mutex_destroy(&iter->mutex); 2658 mutex_destroy(&iter->mutex);
@@ -2615,12 +2671,13 @@ static int tracing_open(struct inode *inode, struct file *file)
2615 /* If this file was open for write, then erase contents */ 2671 /* If this file was open for write, then erase contents */
2616 if ((file->f_mode & FMODE_WRITE) && 2672 if ((file->f_mode & FMODE_WRITE) &&
2617 (file->f_flags & O_TRUNC)) { 2673 (file->f_flags & O_TRUNC)) {
2618 long cpu = (long) inode->i_private; 2674 struct trace_cpu *tc = inode->i_private;
2675 struct trace_array *tr = tc->tr;
2619 2676
2620 if (cpu == RING_BUFFER_ALL_CPUS) 2677 if (tc->cpu == RING_BUFFER_ALL_CPUS)
2621 tracing_reset_online_cpus(&global_trace); 2678 tracing_reset_online_cpus(tr);
2622 else 2679 else
2623 tracing_reset(&global_trace, cpu); 2680 tracing_reset(tr, tc->cpu);
2624 } 2681 }
2625 2682
2626 if (file->f_mode & FMODE_READ) { 2683 if (file->f_mode & FMODE_READ) {
@@ -2767,8 +2824,9 @@ static ssize_t
2767tracing_cpumask_write(struct file *filp, const char __user *ubuf, 2824tracing_cpumask_write(struct file *filp, const char __user *ubuf,
2768 size_t count, loff_t *ppos) 2825 size_t count, loff_t *ppos)
2769{ 2826{
2770 int err, cpu; 2827 struct trace_array *tr = filp->private_data;
2771 cpumask_var_t tracing_cpumask_new; 2828 cpumask_var_t tracing_cpumask_new;
2829 int err, cpu;
2772 2830
2773 if (!alloc_cpumask_var(&tracing_cpumask_new, GFP_KERNEL)) 2831 if (!alloc_cpumask_var(&tracing_cpumask_new, GFP_KERNEL))
2774 return -ENOMEM; 2832 return -ENOMEM;
@@ -2788,13 +2846,13 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,
2788 */ 2846 */
2789 if (cpumask_test_cpu(cpu, tracing_cpumask) && 2847 if (cpumask_test_cpu(cpu, tracing_cpumask) &&
2790 !cpumask_test_cpu(cpu, tracing_cpumask_new)) { 2848 !cpumask_test_cpu(cpu, tracing_cpumask_new)) {
2791 atomic_inc(&global_trace.data[cpu]->disabled); 2849 atomic_inc(&tr->data[cpu]->disabled);
2792 ring_buffer_record_disable_cpu(global_trace.buffer, cpu); 2850 ring_buffer_record_disable_cpu(tr->buffer, cpu);
2793 } 2851 }
2794 if (!cpumask_test_cpu(cpu, tracing_cpumask) && 2852 if (!cpumask_test_cpu(cpu, tracing_cpumask) &&
2795 cpumask_test_cpu(cpu, tracing_cpumask_new)) { 2853 cpumask_test_cpu(cpu, tracing_cpumask_new)) {
2796 atomic_dec(&global_trace.data[cpu]->disabled); 2854 atomic_dec(&tr->data[cpu]->disabled);
2797 ring_buffer_record_enable_cpu(global_trace.buffer, cpu); 2855 ring_buffer_record_enable_cpu(tr->buffer, cpu);
2798 } 2856 }
2799 } 2857 }
2800 arch_spin_unlock(&ftrace_max_lock); 2858 arch_spin_unlock(&ftrace_max_lock);
@@ -2823,12 +2881,13 @@ static const struct file_operations tracing_cpumask_fops = {
2823static int tracing_trace_options_show(struct seq_file *m, void *v) 2881static int tracing_trace_options_show(struct seq_file *m, void *v)
2824{ 2882{
2825 struct tracer_opt *trace_opts; 2883 struct tracer_opt *trace_opts;
2884 struct trace_array *tr = m->private;
2826 u32 tracer_flags; 2885 u32 tracer_flags;
2827 int i; 2886 int i;
2828 2887
2829 mutex_lock(&trace_types_lock); 2888 mutex_lock(&trace_types_lock);
2830 tracer_flags = current_trace->flags->val; 2889 tracer_flags = tr->current_trace->flags->val;
2831 trace_opts = current_trace->flags->opts; 2890 trace_opts = tr->current_trace->flags->opts;
2832 2891
2833 for (i = 0; trace_options[i]; i++) { 2892 for (i = 0; trace_options[i]; i++) {
2834 if (trace_flags & (1 << i)) 2893 if (trace_flags & (1 << i))
@@ -2892,15 +2951,15 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
2892 return 0; 2951 return 0;
2893} 2952}
2894 2953
2895int set_tracer_flag(unsigned int mask, int enabled) 2954int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
2896{ 2955{
2897 /* do nothing if flag is already set */ 2956 /* do nothing if flag is already set */
2898 if (!!(trace_flags & mask) == !!enabled) 2957 if (!!(trace_flags & mask) == !!enabled)
2899 return 0; 2958 return 0;
2900 2959
2901 /* Give the tracer a chance to approve the change */ 2960 /* Give the tracer a chance to approve the change */
2902 if (current_trace->flag_changed) 2961 if (tr->current_trace->flag_changed)
2903 if (current_trace->flag_changed(current_trace, mask, !!enabled)) 2962 if (tr->current_trace->flag_changed(tr->current_trace, mask, !!enabled))
2904 return -EINVAL; 2963 return -EINVAL;
2905 2964
2906 if (enabled) 2965 if (enabled)
@@ -2924,7 +2983,7 @@ int set_tracer_flag(unsigned int mask, int enabled)
2924 return 0; 2983 return 0;
2925} 2984}
2926 2985
2927static int trace_set_options(char *option) 2986static int trace_set_options(struct trace_array *tr, char *option)
2928{ 2987{
2929 char *cmp; 2988 char *cmp;
2930 int neg = 0; 2989 int neg = 0;
@@ -2942,14 +3001,14 @@ static int trace_set_options(char *option)
2942 3001
2943 for (i = 0; trace_options[i]; i++) { 3002 for (i = 0; trace_options[i]; i++) {
2944 if (strcmp(cmp, trace_options[i]) == 0) { 3003 if (strcmp(cmp, trace_options[i]) == 0) {
2945 ret = set_tracer_flag(1 << i, !neg); 3004 ret = set_tracer_flag(tr, 1 << i, !neg);
2946 break; 3005 break;
2947 } 3006 }
2948 } 3007 }
2949 3008
2950 /* If no option could be set, test the specific tracer options */ 3009 /* If no option could be set, test the specific tracer options */
2951 if (!trace_options[i]) 3010 if (!trace_options[i])
2952 ret = set_tracer_option(current_trace, cmp, neg); 3011 ret = set_tracer_option(tr->current_trace, cmp, neg);
2953 3012
2954 mutex_unlock(&trace_types_lock); 3013 mutex_unlock(&trace_types_lock);
2955 3014
@@ -2960,6 +3019,8 @@ static ssize_t
2960tracing_trace_options_write(struct file *filp, const char __user *ubuf, 3019tracing_trace_options_write(struct file *filp, const char __user *ubuf,
2961 size_t cnt, loff_t *ppos) 3020 size_t cnt, loff_t *ppos)
2962{ 3021{
3022 struct seq_file *m = filp->private_data;
3023 struct trace_array *tr = m->private;
2963 char buf[64]; 3024 char buf[64];
2964 int ret; 3025 int ret;
2965 3026
@@ -2971,7 +3032,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,
2971 3032
2972 buf[cnt] = 0; 3033 buf[cnt] = 0;
2973 3034
2974 ret = trace_set_options(buf); 3035 ret = trace_set_options(tr, buf);
2975 if (ret < 0) 3036 if (ret < 0)
2976 return ret; 3037 return ret;
2977 3038
@@ -2984,7 +3045,8 @@ static int tracing_trace_options_open(struct inode *inode, struct file *file)
2984{ 3045{
2985 if (tracing_disabled) 3046 if (tracing_disabled)
2986 return -ENODEV; 3047 return -ENODEV;
2987 return single_open(file, tracing_trace_options_show, NULL); 3048
3049 return single_open(file, tracing_trace_options_show, inode->i_private);
2988} 3050}
2989 3051
2990static const struct file_operations tracing_iter_fops = { 3052static const struct file_operations tracing_iter_fops = {
@@ -3082,11 +3144,12 @@ static ssize_t
3082tracing_set_trace_read(struct file *filp, char __user *ubuf, 3144tracing_set_trace_read(struct file *filp, char __user *ubuf,
3083 size_t cnt, loff_t *ppos) 3145 size_t cnt, loff_t *ppos)
3084{ 3146{
3147 struct trace_array *tr = filp->private_data;
3085 char buf[MAX_TRACER_SIZE+2]; 3148 char buf[MAX_TRACER_SIZE+2];
3086 int r; 3149 int r;
3087 3150
3088 mutex_lock(&trace_types_lock); 3151 mutex_lock(&trace_types_lock);
3089 r = sprintf(buf, "%s\n", current_trace->name); 3152 r = sprintf(buf, "%s\n", tr->current_trace->name);
3090 mutex_unlock(&trace_types_lock); 3153 mutex_unlock(&trace_types_lock);
3091 3154
3092 return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); 3155 return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
@@ -3130,7 +3193,8 @@ static int resize_buffer_duplicate_size(struct trace_array *tr,
3130 return ret; 3193 return ret;
3131} 3194}
3132 3195
3133static int __tracing_resize_ring_buffer(unsigned long size, int cpu) 3196static int __tracing_resize_ring_buffer(struct trace_array *tr,
3197 unsigned long size, int cpu)
3134{ 3198{
3135 int ret; 3199 int ret;
3136 3200
@@ -3142,20 +3206,20 @@ static int __tracing_resize_ring_buffer(unsigned long size, int cpu)
3142 ring_buffer_expanded = 1; 3206 ring_buffer_expanded = 1;
3143 3207
3144 /* May be called before buffers are initialized */ 3208 /* May be called before buffers are initialized */
3145 if (!global_trace.buffer) 3209 if (!tr->buffer)
3146 return 0; 3210 return 0;
3147 3211
3148 ret = ring_buffer_resize(global_trace.buffer, size, cpu); 3212 ret = ring_buffer_resize(tr->buffer, size, cpu);
3149 if (ret < 0) 3213 if (ret < 0)
3150 return ret; 3214 return ret;
3151 3215
3152 if (!current_trace->use_max_tr) 3216 if (!(tr->flags & TRACE_ARRAY_FL_GLOBAL) ||
3217 !tr->current_trace->use_max_tr)
3153 goto out; 3218 goto out;
3154 3219
3155 ret = ring_buffer_resize(max_tr.buffer, size, cpu); 3220 ret = ring_buffer_resize(max_tr.buffer, size, cpu);
3156 if (ret < 0) { 3221 if (ret < 0) {
3157 int r = resize_buffer_duplicate_size(&global_trace, 3222 int r = resize_buffer_duplicate_size(tr, tr, cpu);
3158 &global_trace, cpu);
3159 if (r < 0) { 3223 if (r < 0) {
3160 /* 3224 /*
3161 * AARGH! We are left with different 3225 * AARGH! We are left with different
@@ -3184,14 +3248,15 @@ static int __tracing_resize_ring_buffer(unsigned long size, int cpu)
3184 3248
3185 out: 3249 out:
3186 if (cpu == RING_BUFFER_ALL_CPUS) 3250 if (cpu == RING_BUFFER_ALL_CPUS)
3187 set_buffer_entries(&global_trace, size); 3251 set_buffer_entries(tr, size);
3188 else 3252 else
3189 global_trace.data[cpu]->entries = size; 3253 tr->data[cpu]->entries = size;
3190 3254
3191 return ret; 3255 return ret;
3192} 3256}
3193 3257
3194static ssize_t tracing_resize_ring_buffer(unsigned long size, int cpu_id) 3258static ssize_t tracing_resize_ring_buffer(struct trace_array *tr,
3259 unsigned long size, int cpu_id)
3195{ 3260{
3196 int ret = size; 3261 int ret = size;
3197 3262
@@ -3205,7 +3270,7 @@ static ssize_t tracing_resize_ring_buffer(unsigned long size, int cpu_id)
3205 } 3270 }
3206 } 3271 }
3207 3272
3208 ret = __tracing_resize_ring_buffer(size, cpu_id); 3273 ret = __tracing_resize_ring_buffer(tr, size, cpu_id);
3209 if (ret < 0) 3274 if (ret < 0)
3210 ret = -ENOMEM; 3275 ret = -ENOMEM;
3211 3276
@@ -3232,7 +3297,7 @@ int tracing_update_buffers(void)
3232 3297
3233 mutex_lock(&trace_types_lock); 3298 mutex_lock(&trace_types_lock);
3234 if (!ring_buffer_expanded) 3299 if (!ring_buffer_expanded)
3235 ret = __tracing_resize_ring_buffer(trace_buf_size, 3300 ret = __tracing_resize_ring_buffer(&global_trace, trace_buf_size,
3236 RING_BUFFER_ALL_CPUS); 3301 RING_BUFFER_ALL_CPUS);
3237 mutex_unlock(&trace_types_lock); 3302 mutex_unlock(&trace_types_lock);
3238 3303
@@ -3242,7 +3307,7 @@ int tracing_update_buffers(void)
3242struct trace_option_dentry; 3307struct trace_option_dentry;
3243 3308
3244static struct trace_option_dentry * 3309static struct trace_option_dentry *
3245create_trace_option_files(struct tracer *tracer); 3310create_trace_option_files(struct trace_array *tr, struct tracer *tracer);
3246 3311
3247static void 3312static void
3248destroy_trace_option_files(struct trace_option_dentry *topts); 3313destroy_trace_option_files(struct trace_option_dentry *topts);
@@ -3258,7 +3323,7 @@ static int tracing_set_tracer(const char *buf)
3258 mutex_lock(&trace_types_lock); 3323 mutex_lock(&trace_types_lock);
3259 3324
3260 if (!ring_buffer_expanded) { 3325 if (!ring_buffer_expanded) {
3261 ret = __tracing_resize_ring_buffer(trace_buf_size, 3326 ret = __tracing_resize_ring_buffer(tr, trace_buf_size,
3262 RING_BUFFER_ALL_CPUS); 3327 RING_BUFFER_ALL_CPUS);
3263 if (ret < 0) 3328 if (ret < 0)
3264 goto out; 3329 goto out;
@@ -3273,18 +3338,18 @@ static int tracing_set_tracer(const char *buf)
3273 ret = -EINVAL; 3338 ret = -EINVAL;
3274 goto out; 3339 goto out;
3275 } 3340 }
3276 if (t == current_trace) 3341 if (t == tr->current_trace)
3277 goto out; 3342 goto out;
3278 3343
3279 trace_branch_disable(); 3344 trace_branch_disable();
3280 3345
3281 current_trace->enabled = false; 3346 tr->current_trace->enabled = false;
3282 3347
3283 if (current_trace->reset) 3348 if (tr->current_trace->reset)
3284 current_trace->reset(tr); 3349 tr->current_trace->reset(tr);
3285 3350
3286 had_max_tr = current_trace->allocated_snapshot; 3351 had_max_tr = tr->current_trace->allocated_snapshot;
3287 current_trace = &nop_trace; 3352 tr->current_trace = &nop_trace;
3288 3353
3289 if (had_max_tr && !t->use_max_tr) { 3354 if (had_max_tr && !t->use_max_tr) {
3290 /* 3355 /*
@@ -3303,11 +3368,11 @@ static int tracing_set_tracer(const char *buf)
3303 ring_buffer_resize(max_tr.buffer, 1, RING_BUFFER_ALL_CPUS); 3368 ring_buffer_resize(max_tr.buffer, 1, RING_BUFFER_ALL_CPUS);
3304 set_buffer_entries(&max_tr, 1); 3369 set_buffer_entries(&max_tr, 1);
3305 tracing_reset_online_cpus(&max_tr); 3370 tracing_reset_online_cpus(&max_tr);
3306 current_trace->allocated_snapshot = false; 3371 tr->current_trace->allocated_snapshot = false;
3307 } 3372 }
3308 destroy_trace_option_files(topts); 3373 destroy_trace_option_files(topts);
3309 3374
3310 topts = create_trace_option_files(t); 3375 topts = create_trace_option_files(tr, t);
3311 if (t->use_max_tr && !had_max_tr) { 3376 if (t->use_max_tr && !had_max_tr) {
3312 /* we need to make per cpu buffer sizes equivalent */ 3377 /* we need to make per cpu buffer sizes equivalent */
3313 ret = resize_buffer_duplicate_size(&max_tr, &global_trace, 3378 ret = resize_buffer_duplicate_size(&max_tr, &global_trace,
@@ -3323,8 +3388,8 @@ static int tracing_set_tracer(const char *buf)
3323 goto out; 3388 goto out;
3324 } 3389 }
3325 3390
3326 current_trace = t; 3391 tr->current_trace = t;
3327 current_trace->enabled = true; 3392 tr->current_trace->enabled = true;
3328 trace_branch_enable(tr); 3393 trace_branch_enable(tr);
3329 out: 3394 out:
3330 mutex_unlock(&trace_types_lock); 3395 mutex_unlock(&trace_types_lock);
@@ -3398,7 +3463,8 @@ tracing_max_lat_write(struct file *filp, const char __user *ubuf,
3398 3463
3399static int tracing_open_pipe(struct inode *inode, struct file *filp) 3464static int tracing_open_pipe(struct inode *inode, struct file *filp)
3400{ 3465{
3401 long cpu_file = (long) inode->i_private; 3466 struct trace_cpu *tc = inode->i_private;
3467 struct trace_array *tr = tc->tr;
3402 struct trace_iterator *iter; 3468 struct trace_iterator *iter;
3403 int ret = 0; 3469 int ret = 0;
3404 3470
@@ -3423,7 +3489,7 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
3423 ret = -ENOMEM; 3489 ret = -ENOMEM;
3424 goto fail; 3490 goto fail;
3425 } 3491 }
3426 *iter->trace = *current_trace; 3492 *iter->trace = *tr->current_trace;
3427 3493
3428 if (!alloc_cpumask_var(&iter->started, GFP_KERNEL)) { 3494 if (!alloc_cpumask_var(&iter->started, GFP_KERNEL)) {
3429 ret = -ENOMEM; 3495 ret = -ENOMEM;
@@ -3440,8 +3506,8 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
3440 if (trace_clocks[trace_clock_id].in_ns) 3506 if (trace_clocks[trace_clock_id].in_ns)
3441 iter->iter_flags |= TRACE_FILE_TIME_IN_NS; 3507 iter->iter_flags |= TRACE_FILE_TIME_IN_NS;
3442 3508
3443 iter->cpu_file = cpu_file; 3509 iter->cpu_file = tc->cpu;
3444 iter->tr = &global_trace; 3510 iter->tr = tc->tr;
3445 mutex_init(&iter->mutex); 3511 mutex_init(&iter->mutex);
3446 filp->private_data = iter; 3512 filp->private_data = iter;
3447 3513
@@ -3563,6 +3629,7 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
3563 size_t cnt, loff_t *ppos) 3629 size_t cnt, loff_t *ppos)
3564{ 3630{
3565 struct trace_iterator *iter = filp->private_data; 3631 struct trace_iterator *iter = filp->private_data;
3632 struct trace_array *tr = iter->tr;
3566 ssize_t sret; 3633 ssize_t sret;
3567 3634
3568 /* return any leftover data */ 3635 /* return any leftover data */
@@ -3574,8 +3641,8 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
3574 3641
3575 /* copy the tracer to avoid using a global lock all around */ 3642 /* copy the tracer to avoid using a global lock all around */
3576 mutex_lock(&trace_types_lock); 3643 mutex_lock(&trace_types_lock);
3577 if (unlikely(iter->trace->name != current_trace->name)) 3644 if (unlikely(iter->trace->name != tr->current_trace->name))
3578 *iter->trace = *current_trace; 3645 *iter->trace = *tr->current_trace;
3579 mutex_unlock(&trace_types_lock); 3646 mutex_unlock(&trace_types_lock);
3580 3647
3581 /* 3648 /*
@@ -3731,6 +3798,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,
3731 .ops = &tracing_pipe_buf_ops, 3798 .ops = &tracing_pipe_buf_ops,
3732 .spd_release = tracing_spd_release_pipe, 3799 .spd_release = tracing_spd_release_pipe,
3733 }; 3800 };
3801 struct trace_array *tr = iter->tr;
3734 ssize_t ret; 3802 ssize_t ret;
3735 size_t rem; 3803 size_t rem;
3736 unsigned int i; 3804 unsigned int i;
@@ -3740,8 +3808,8 @@ static ssize_t tracing_splice_read_pipe(struct file *filp,
3740 3808
3741 /* copy the tracer to avoid using a global lock all around */ 3809 /* copy the tracer to avoid using a global lock all around */
3742 mutex_lock(&trace_types_lock); 3810 mutex_lock(&trace_types_lock);
3743 if (unlikely(iter->trace->name != current_trace->name)) 3811 if (unlikely(iter->trace->name != tr->current_trace->name))
3744 *iter->trace = *current_trace; 3812 *iter->trace = *tr->current_trace;
3745 mutex_unlock(&trace_types_lock); 3813 mutex_unlock(&trace_types_lock);
3746 3814
3747 mutex_lock(&iter->mutex); 3815 mutex_lock(&iter->mutex);
@@ -3803,43 +3871,19 @@ out_err:
3803 goto out; 3871 goto out;
3804} 3872}
3805 3873
3806struct ftrace_entries_info {
3807 struct trace_array *tr;
3808 int cpu;
3809};
3810
3811static int tracing_entries_open(struct inode *inode, struct file *filp)
3812{
3813 struct ftrace_entries_info *info;
3814
3815 if (tracing_disabled)
3816 return -ENODEV;
3817
3818 info = kzalloc(sizeof(*info), GFP_KERNEL);
3819 if (!info)
3820 return -ENOMEM;
3821
3822 info->tr = &global_trace;
3823 info->cpu = (unsigned long)inode->i_private;
3824
3825 filp->private_data = info;
3826
3827 return 0;
3828}
3829
3830static ssize_t 3874static ssize_t
3831tracing_entries_read(struct file *filp, char __user *ubuf, 3875tracing_entries_read(struct file *filp, char __user *ubuf,
3832 size_t cnt, loff_t *ppos) 3876 size_t cnt, loff_t *ppos)
3833{ 3877{
3834 struct ftrace_entries_info *info = filp->private_data; 3878 struct trace_cpu *tc = filp->private_data;
3835 struct trace_array *tr = info->tr; 3879 struct trace_array *tr = tc->tr;
3836 char buf[64]; 3880 char buf[64];
3837 int r = 0; 3881 int r = 0;
3838 ssize_t ret; 3882 ssize_t ret;
3839 3883
3840 mutex_lock(&trace_types_lock); 3884 mutex_lock(&trace_types_lock);
3841 3885
3842 if (info->cpu == RING_BUFFER_ALL_CPUS) { 3886 if (tc->cpu == RING_BUFFER_ALL_CPUS) {
3843 int cpu, buf_size_same; 3887 int cpu, buf_size_same;
3844 unsigned long size; 3888 unsigned long size;
3845 3889
@@ -3866,7 +3910,7 @@ tracing_entries_read(struct file *filp, char __user *ubuf,
3866 } else 3910 } else
3867 r = sprintf(buf, "X\n"); 3911 r = sprintf(buf, "X\n");
3868 } else 3912 } else
3869 r = sprintf(buf, "%lu\n", tr->data[info->cpu]->entries >> 10); 3913 r = sprintf(buf, "%lu\n", tr->data[tc->cpu]->entries >> 10);
3870 3914
3871 mutex_unlock(&trace_types_lock); 3915 mutex_unlock(&trace_types_lock);
3872 3916
@@ -3878,7 +3922,7 @@ static ssize_t
3878tracing_entries_write(struct file *filp, const char __user *ubuf, 3922tracing_entries_write(struct file *filp, const char __user *ubuf,
3879 size_t cnt, loff_t *ppos) 3923 size_t cnt, loff_t *ppos)
3880{ 3924{
3881 struct ftrace_entries_info *info = filp->private_data; 3925 struct trace_cpu *tc = filp->private_data;
3882 unsigned long val; 3926 unsigned long val;
3883 int ret; 3927 int ret;
3884 3928
@@ -3893,7 +3937,7 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
3893 /* value is in KB */ 3937 /* value is in KB */
3894 val <<= 10; 3938 val <<= 10;
3895 3939
3896 ret = tracing_resize_ring_buffer(val, info->cpu); 3940 ret = tracing_resize_ring_buffer(tc->tr, val, tc->cpu);
3897 if (ret < 0) 3941 if (ret < 0)
3898 return ret; 3942 return ret;
3899 3943
@@ -3902,16 +3946,6 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
3902 return cnt; 3946 return cnt;
3903} 3947}
3904 3948
3905static int
3906tracing_entries_release(struct inode *inode, struct file *filp)
3907{
3908 struct ftrace_entries_info *info = filp->private_data;
3909
3910 kfree(info);
3911
3912 return 0;
3913}
3914
3915static ssize_t 3949static ssize_t
3916tracing_total_entries_read(struct file *filp, char __user *ubuf, 3950tracing_total_entries_read(struct file *filp, char __user *ubuf,
3917 size_t cnt, loff_t *ppos) 3951 size_t cnt, loff_t *ppos)
@@ -3953,11 +3987,13 @@ tracing_free_buffer_write(struct file *filp, const char __user *ubuf,
3953static int 3987static int
3954tracing_free_buffer_release(struct inode *inode, struct file *filp) 3988tracing_free_buffer_release(struct inode *inode, struct file *filp)
3955{ 3989{
3990 struct trace_array *tr = inode->i_private;
3991
3956 /* disable tracing ? */ 3992 /* disable tracing ? */
3957 if (trace_flags & TRACE_ITER_STOP_ON_FREE) 3993 if (trace_flags & TRACE_ITER_STOP_ON_FREE)
3958 tracing_off(); 3994 tracing_off();
3959 /* resize the ring buffer to 0 */ 3995 /* resize the ring buffer to 0 */
3960 tracing_resize_ring_buffer(0, RING_BUFFER_ALL_CPUS); 3996 tracing_resize_ring_buffer(tr, 0, RING_BUFFER_ALL_CPUS);
3961 3997
3962 return 0; 3998 return 0;
3963} 3999}
@@ -4068,13 +4104,14 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
4068 4104
4069static int tracing_clock_show(struct seq_file *m, void *v) 4105static int tracing_clock_show(struct seq_file *m, void *v)
4070{ 4106{
4107 struct trace_array *tr = m->private;
4071 int i; 4108 int i;
4072 4109
4073 for (i = 0; i < ARRAY_SIZE(trace_clocks); i++) 4110 for (i = 0; i < ARRAY_SIZE(trace_clocks); i++)
4074 seq_printf(m, 4111 seq_printf(m,
4075 "%s%s%s%s", i ? " " : "", 4112 "%s%s%s%s", i ? " " : "",
4076 i == trace_clock_id ? "[" : "", trace_clocks[i].name, 4113 i == tr->clock_id ? "[" : "", trace_clocks[i].name,
4077 i == trace_clock_id ? "]" : ""); 4114 i == tr->clock_id ? "]" : "");
4078 seq_putc(m, '\n'); 4115 seq_putc(m, '\n');
4079 4116
4080 return 0; 4117 return 0;
@@ -4083,6 +4120,8 @@ static int tracing_clock_show(struct seq_file *m, void *v)
4083static ssize_t tracing_clock_write(struct file *filp, const char __user *ubuf, 4120static ssize_t tracing_clock_write(struct file *filp, const char __user *ubuf,
4084 size_t cnt, loff_t *fpos) 4121 size_t cnt, loff_t *fpos)
4085{ 4122{
4123 struct seq_file *m = filp->private_data;
4124 struct trace_array *tr = m->private;
4086 char buf[64]; 4125 char buf[64];
4087 const char *clockstr; 4126 const char *clockstr;
4088 int i; 4127 int i;
@@ -4104,12 +4143,12 @@ static ssize_t tracing_clock_write(struct file *filp, const char __user *ubuf,
4104 if (i == ARRAY_SIZE(trace_clocks)) 4143 if (i == ARRAY_SIZE(trace_clocks))
4105 return -EINVAL; 4144 return -EINVAL;
4106 4145
4107 trace_clock_id = i;
4108
4109 mutex_lock(&trace_types_lock); 4146 mutex_lock(&trace_types_lock);
4110 4147
4111 ring_buffer_set_clock(global_trace.buffer, trace_clocks[i].func); 4148 tr->clock_id = i;
4112 if (max_tr.buffer) 4149
4150 ring_buffer_set_clock(tr->buffer, trace_clocks[i].func);
4151 if (tr->flags & TRACE_ARRAY_FL_GLOBAL && max_tr.buffer)
4113 ring_buffer_set_clock(max_tr.buffer, trace_clocks[i].func); 4152 ring_buffer_set_clock(max_tr.buffer, trace_clocks[i].func);
4114 4153
4115 /* 4154 /*
@@ -4130,20 +4169,37 @@ static int tracing_clock_open(struct inode *inode, struct file *file)
4130{ 4169{
4131 if (tracing_disabled) 4170 if (tracing_disabled)
4132 return -ENODEV; 4171 return -ENODEV;
4133 return single_open(file, tracing_clock_show, NULL); 4172
4173 return single_open(file, tracing_clock_show, inode->i_private);
4134} 4174}
4135 4175
4136#ifdef CONFIG_TRACER_SNAPSHOT 4176#ifdef CONFIG_TRACER_SNAPSHOT
4137static int tracing_snapshot_open(struct inode *inode, struct file *file) 4177static int tracing_snapshot_open(struct inode *inode, struct file *file)
4138{ 4178{
4179 struct trace_cpu *tc = inode->i_private;
4139 struct trace_iterator *iter; 4180 struct trace_iterator *iter;
4181 struct seq_file *m;
4140 int ret = 0; 4182 int ret = 0;
4141 4183
4142 if (file->f_mode & FMODE_READ) { 4184 if (file->f_mode & FMODE_READ) {
4143 iter = __tracing_open(inode, file, true); 4185 iter = __tracing_open(inode, file, true);
4144 if (IS_ERR(iter)) 4186 if (IS_ERR(iter))
4145 ret = PTR_ERR(iter); 4187 ret = PTR_ERR(iter);
4188 } else {
4189 /* Writes still need the seq_file to hold the private data */
4190 m = kzalloc(sizeof(*m), GFP_KERNEL);
4191 if (!m)
4192 return -ENOMEM;
4193 iter = kzalloc(sizeof(*iter), GFP_KERNEL);
4194 if (!iter) {
4195 kfree(m);
4196 return -ENOMEM;
4197 }
4198 iter->tr = tc->tr;
4199 m->private = iter;
4200 file->private_data = m;
4146 } 4201 }
4202
4147 return ret; 4203 return ret;
4148} 4204}
4149 4205
@@ -4151,6 +4207,9 @@ static ssize_t
4151tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt, 4207tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
4152 loff_t *ppos) 4208 loff_t *ppos)
4153{ 4209{
4210 struct seq_file *m = filp->private_data;
4211 struct trace_iterator *iter = m->private;
4212 struct trace_array *tr = iter->tr;
4154 unsigned long val; 4213 unsigned long val;
4155 int ret; 4214 int ret;
4156 4215
@@ -4164,30 +4223,30 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
4164 4223
4165 mutex_lock(&trace_types_lock); 4224 mutex_lock(&trace_types_lock);
4166 4225
4167 if (current_trace->use_max_tr) { 4226 if (tr->current_trace->use_max_tr) {
4168 ret = -EBUSY; 4227 ret = -EBUSY;
4169 goto out; 4228 goto out;
4170 } 4229 }
4171 4230
4172 switch (val) { 4231 switch (val) {
4173 case 0: 4232 case 0:
4174 if (current_trace->allocated_snapshot) { 4233 if (tr->current_trace->allocated_snapshot) {
4175 /* free spare buffer */ 4234 /* free spare buffer */
4176 ring_buffer_resize(max_tr.buffer, 1, 4235 ring_buffer_resize(max_tr.buffer, 1,
4177 RING_BUFFER_ALL_CPUS); 4236 RING_BUFFER_ALL_CPUS);
4178 set_buffer_entries(&max_tr, 1); 4237 set_buffer_entries(&max_tr, 1);
4179 tracing_reset_online_cpus(&max_tr); 4238 tracing_reset_online_cpus(&max_tr);
4180 current_trace->allocated_snapshot = false; 4239 tr->current_trace->allocated_snapshot = false;
4181 } 4240 }
4182 break; 4241 break;
4183 case 1: 4242 case 1:
4184 if (!current_trace->allocated_snapshot) { 4243 if (!tr->current_trace->allocated_snapshot) {
4185 /* allocate spare buffer */ 4244 /* allocate spare buffer */
4186 ret = resize_buffer_duplicate_size(&max_tr, 4245 ret = resize_buffer_duplicate_size(&max_tr,
4187 &global_trace, RING_BUFFER_ALL_CPUS); 4246 &global_trace, RING_BUFFER_ALL_CPUS);
4188 if (ret < 0) 4247 if (ret < 0)
4189 break; 4248 break;
4190 current_trace->allocated_snapshot = true; 4249 tr->current_trace->allocated_snapshot = true;
4191 } 4250 }
4192 4251
4193 local_irq_disable(); 4252 local_irq_disable();
@@ -4196,7 +4255,7 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
4196 local_irq_enable(); 4255 local_irq_enable();
4197 break; 4256 break;
4198 default: 4257 default:
4199 if (current_trace->allocated_snapshot) 4258 if (tr->current_trace->allocated_snapshot)
4200 tracing_reset_online_cpus(&max_tr); 4259 tracing_reset_online_cpus(&max_tr);
4201 break; 4260 break;
4202 } 4261 }
@@ -4209,6 +4268,22 @@ out:
4209 mutex_unlock(&trace_types_lock); 4268 mutex_unlock(&trace_types_lock);
4210 return ret; 4269 return ret;
4211} 4270}
4271
4272static int tracing_snapshot_release(struct inode *inode, struct file *file)
4273{
4274 struct seq_file *m = file->private_data;
4275
4276 if (file->f_mode & FMODE_READ)
4277 return tracing_release(inode, file);
4278
4279 /* If write only, the seq_file is just a stub */
4280 if (m)
4281 kfree(m->private);
4282 kfree(m);
4283
4284 return 0;
4285}
4286
4212#endif /* CONFIG_TRACER_SNAPSHOT */ 4287#endif /* CONFIG_TRACER_SNAPSHOT */
4213 4288
4214 4289
@@ -4236,10 +4311,9 @@ static const struct file_operations tracing_pipe_fops = {
4236}; 4311};
4237 4312
4238static const struct file_operations tracing_entries_fops = { 4313static const struct file_operations tracing_entries_fops = {
4239 .open = tracing_entries_open, 4314 .open = tracing_open_generic,
4240 .read = tracing_entries_read, 4315 .read = tracing_entries_read,
4241 .write = tracing_entries_write, 4316 .write = tracing_entries_write,
4242 .release = tracing_entries_release,
4243 .llseek = generic_file_llseek, 4317 .llseek = generic_file_llseek,
4244}; 4318};
4245 4319
@@ -4274,7 +4348,7 @@ static const struct file_operations snapshot_fops = {
4274 .read = seq_read, 4348 .read = seq_read,
4275 .write = tracing_snapshot_write, 4349 .write = tracing_snapshot_write,
4276 .llseek = tracing_seek, 4350 .llseek = tracing_seek,
4277 .release = tracing_release, 4351 .release = tracing_snapshot_release,
4278}; 4352};
4279#endif /* CONFIG_TRACER_SNAPSHOT */ 4353#endif /* CONFIG_TRACER_SNAPSHOT */
4280 4354
@@ -4287,7 +4361,8 @@ struct ftrace_buffer_info {
4287 4361
4288static int tracing_buffers_open(struct inode *inode, struct file *filp) 4362static int tracing_buffers_open(struct inode *inode, struct file *filp)
4289{ 4363{
4290 int cpu = (int)(long)inode->i_private; 4364 struct trace_cpu *tc = inode->i_private;
4365 struct trace_array *tr = tc->tr;
4291 struct ftrace_buffer_info *info; 4366 struct ftrace_buffer_info *info;
4292 4367
4293 if (tracing_disabled) 4368 if (tracing_disabled)
@@ -4297,8 +4372,8 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
4297 if (!info) 4372 if (!info)
4298 return -ENOMEM; 4373 return -ENOMEM;
4299 4374
4300 info->tr = &global_trace; 4375 info->tr = tr;
4301 info->cpu = cpu; 4376 info->cpu = tc->cpu;
4302 info->spare = NULL; 4377 info->spare = NULL;
4303 /* Force reading ring buffer for first read */ 4378 /* Force reading ring buffer for first read */
4304 info->read = (unsigned int)-1; 4379 info->read = (unsigned int)-1;
@@ -4535,12 +4610,13 @@ static ssize_t
4535tracing_stats_read(struct file *filp, char __user *ubuf, 4610tracing_stats_read(struct file *filp, char __user *ubuf,
4536 size_t count, loff_t *ppos) 4611 size_t count, loff_t *ppos)
4537{ 4612{
4538 unsigned long cpu = (unsigned long)filp->private_data; 4613 struct trace_cpu *tc = filp->private_data;
4539 struct trace_array *tr = &global_trace; 4614 struct trace_array *tr = tc->tr;
4540 struct trace_seq *s; 4615 struct trace_seq *s;
4541 unsigned long cnt; 4616 unsigned long cnt;
4542 unsigned long long t; 4617 unsigned long long t;
4543 unsigned long usec_rem; 4618 unsigned long usec_rem;
4619 int cpu = tc->cpu;
4544 4620
4545 s = kmalloc(sizeof(*s), GFP_KERNEL); 4621 s = kmalloc(sizeof(*s), GFP_KERNEL);
4546 if (!s) 4622 if (!s)
@@ -4636,58 +4712,57 @@ static const struct file_operations tracing_dyn_info_fops = {
4636}; 4712};
4637#endif 4713#endif
4638 4714
4639static struct dentry *d_tracer; 4715struct dentry *tracing_init_dentry_tr(struct trace_array *tr)
4640
4641struct dentry *tracing_init_dentry(void)
4642{ 4716{
4643 static int once; 4717 static int once;
4644 4718
4645 if (d_tracer) 4719 if (tr->dir)
4646 return d_tracer; 4720 return tr->dir;
4647 4721
4648 if (!debugfs_initialized()) 4722 if (!debugfs_initialized())
4649 return NULL; 4723 return NULL;
4650 4724
4651 d_tracer = debugfs_create_dir("tracing", NULL); 4725 if (tr->flags & TRACE_ARRAY_FL_GLOBAL)
4726 tr->dir = debugfs_create_dir("tracing", NULL);
4652 4727
4653 if (!d_tracer && !once) { 4728 if (!tr->dir && !once) {
4654 once = 1; 4729 once = 1;
4655 pr_warning("Could not create debugfs directory 'tracing'\n"); 4730 pr_warning("Could not create debugfs directory 'tracing'\n");
4656 return NULL; 4731 return NULL;
4657 } 4732 }
4658 4733
4659 return d_tracer; 4734 return tr->dir;
4660} 4735}
4661 4736
4662static struct dentry *d_percpu; 4737struct dentry *tracing_init_dentry(void)
4738{
4739 return tracing_init_dentry_tr(&global_trace);
4740}
4663 4741
4664static struct dentry *tracing_dentry_percpu(void) 4742static struct dentry *tracing_dentry_percpu(struct trace_array *tr, int cpu)
4665{ 4743{
4666 static int once;
4667 struct dentry *d_tracer; 4744 struct dentry *d_tracer;
4668 4745
4669 if (d_percpu) 4746 if (tr->percpu_dir)
4670 return d_percpu; 4747 return tr->percpu_dir;
4671
4672 d_tracer = tracing_init_dentry();
4673 4748
4749 d_tracer = tracing_init_dentry_tr(tr);
4674 if (!d_tracer) 4750 if (!d_tracer)
4675 return NULL; 4751 return NULL;
4676 4752
4677 d_percpu = debugfs_create_dir("per_cpu", d_tracer); 4753 tr->percpu_dir = debugfs_create_dir("per_cpu", d_tracer);
4678 4754
4679 if (!d_percpu && !once) { 4755 WARN_ONCE(!tr->percpu_dir,
4680 once = 1; 4756 "Could not create debugfs directory 'per_cpu/%d'\n", cpu);
4681 pr_warning("Could not create debugfs directory 'per_cpu'\n");
4682 return NULL;
4683 }
4684 4757
4685 return d_percpu; 4758 return tr->percpu_dir;
4686} 4759}
4687 4760
4688static void tracing_init_debugfs_percpu(long cpu) 4761static void
4762tracing_init_debugfs_percpu(struct trace_array *tr, long cpu)
4689{ 4763{
4690 struct dentry *d_percpu = tracing_dentry_percpu(); 4764 struct trace_array_cpu *data = tr->data[cpu];
4765 struct dentry *d_percpu = tracing_dentry_percpu(tr, cpu);
4691 struct dentry *d_cpu; 4766 struct dentry *d_cpu;
4692 char cpu_dir[30]; /* 30 characters should be more than enough */ 4767 char cpu_dir[30]; /* 30 characters should be more than enough */
4693 4768
@@ -4703,20 +4778,20 @@ static void tracing_init_debugfs_percpu(long cpu)
4703 4778
4704 /* per cpu trace_pipe */ 4779 /* per cpu trace_pipe */
4705 trace_create_file("trace_pipe", 0444, d_cpu, 4780 trace_create_file("trace_pipe", 0444, d_cpu,
4706 (void *) cpu, &tracing_pipe_fops); 4781 (void *)&data->trace_cpu, &tracing_pipe_fops);
4707 4782
4708 /* per cpu trace */ 4783 /* per cpu trace */
4709 trace_create_file("trace", 0644, d_cpu, 4784 trace_create_file("trace", 0644, d_cpu,
4710 (void *) cpu, &tracing_fops); 4785 (void *)&data->trace_cpu, &tracing_fops);
4711 4786
4712 trace_create_file("trace_pipe_raw", 0444, d_cpu, 4787 trace_create_file("trace_pipe_raw", 0444, d_cpu,
4713 (void *) cpu, &tracing_buffers_fops); 4788 (void *)&data->trace_cpu, &tracing_buffers_fops);
4714 4789
4715 trace_create_file("stats", 0444, d_cpu, 4790 trace_create_file("stats", 0444, d_cpu,
4716 (void *) cpu, &tracing_stats_fops); 4791 (void *)&data->trace_cpu, &tracing_stats_fops);
4717 4792
4718 trace_create_file("buffer_size_kb", 0444, d_cpu, 4793 trace_create_file("buffer_size_kb", 0444, d_cpu,
4719 (void *) cpu, &tracing_entries_fops); 4794 (void *)&data->trace_cpu, &tracing_entries_fops);
4720} 4795}
4721 4796
4722#ifdef CONFIG_FTRACE_SELFTEST 4797#ifdef CONFIG_FTRACE_SELFTEST
@@ -4727,6 +4802,7 @@ static void tracing_init_debugfs_percpu(long cpu)
4727struct trace_option_dentry { 4802struct trace_option_dentry {
4728 struct tracer_opt *opt; 4803 struct tracer_opt *opt;
4729 struct tracer_flags *flags; 4804 struct tracer_flags *flags;
4805 struct trace_array *tr;
4730 struct dentry *entry; 4806 struct dentry *entry;
4731}; 4807};
4732 4808
@@ -4762,7 +4838,7 @@ trace_options_write(struct file *filp, const char __user *ubuf, size_t cnt,
4762 4838
4763 if (!!(topt->flags->val & topt->opt->bit) != val) { 4839 if (!!(topt->flags->val & topt->opt->bit) != val) {
4764 mutex_lock(&trace_types_lock); 4840 mutex_lock(&trace_types_lock);
4765 ret = __set_tracer_option(current_trace, topt->flags, 4841 ret = __set_tracer_option(topt->tr->current_trace, topt->flags,
4766 topt->opt, !val); 4842 topt->opt, !val);
4767 mutex_unlock(&trace_types_lock); 4843 mutex_unlock(&trace_types_lock);
4768 if (ret) 4844 if (ret)
@@ -4801,6 +4877,7 @@ static ssize_t
4801trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt, 4877trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt,
4802 loff_t *ppos) 4878 loff_t *ppos)
4803{ 4879{
4880 struct trace_array *tr = &global_trace;
4804 long index = (long)filp->private_data; 4881 long index = (long)filp->private_data;
4805 unsigned long val; 4882 unsigned long val;
4806 int ret; 4883 int ret;
@@ -4813,7 +4890,7 @@ trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt,
4813 return -EINVAL; 4890 return -EINVAL;
4814 4891
4815 mutex_lock(&trace_types_lock); 4892 mutex_lock(&trace_types_lock);
4816 ret = set_tracer_flag(1 << index, val); 4893 ret = set_tracer_flag(tr, 1 << index, val);
4817 mutex_unlock(&trace_types_lock); 4894 mutex_unlock(&trace_types_lock);
4818 4895
4819 if (ret < 0) 4896 if (ret < 0)
@@ -4847,40 +4924,41 @@ struct dentry *trace_create_file(const char *name,
4847} 4924}
4848 4925
4849 4926
4850static struct dentry *trace_options_init_dentry(void) 4927static struct dentry *trace_options_init_dentry(struct trace_array *tr)
4851{ 4928{
4852 struct dentry *d_tracer; 4929 struct dentry *d_tracer;
4853 static struct dentry *t_options;
4854 4930
4855 if (t_options) 4931 if (tr->options)
4856 return t_options; 4932 return tr->options;
4857 4933
4858 d_tracer = tracing_init_dentry(); 4934 d_tracer = tracing_init_dentry_tr(tr);
4859 if (!d_tracer) 4935 if (!d_tracer)
4860 return NULL; 4936 return NULL;
4861 4937
4862 t_options = debugfs_create_dir("options", d_tracer); 4938 tr->options = debugfs_create_dir("options", d_tracer);
4863 if (!t_options) { 4939 if (!tr->options) {
4864 pr_warning("Could not create debugfs directory 'options'\n"); 4940 pr_warning("Could not create debugfs directory 'options'\n");
4865 return NULL; 4941 return NULL;
4866 } 4942 }
4867 4943
4868 return t_options; 4944 return tr->options;
4869} 4945}
4870 4946
4871static void 4947static void
4872create_trace_option_file(struct trace_option_dentry *topt, 4948create_trace_option_file(struct trace_array *tr,
4949 struct trace_option_dentry *topt,
4873 struct tracer_flags *flags, 4950 struct tracer_flags *flags,
4874 struct tracer_opt *opt) 4951 struct tracer_opt *opt)
4875{ 4952{
4876 struct dentry *t_options; 4953 struct dentry *t_options;
4877 4954
4878 t_options = trace_options_init_dentry(); 4955 t_options = trace_options_init_dentry(tr);
4879 if (!t_options) 4956 if (!t_options)
4880 return; 4957 return;
4881 4958
4882 topt->flags = flags; 4959 topt->flags = flags;
4883 topt->opt = opt; 4960 topt->opt = opt;
4961 topt->tr = tr;
4884 4962
4885 topt->entry = trace_create_file(opt->name, 0644, t_options, topt, 4963 topt->entry = trace_create_file(opt->name, 0644, t_options, topt,
4886 &trace_options_fops); 4964 &trace_options_fops);
@@ -4888,7 +4966,7 @@ create_trace_option_file(struct trace_option_dentry *topt,
4888} 4966}
4889 4967
4890static struct trace_option_dentry * 4968static struct trace_option_dentry *
4891create_trace_option_files(struct tracer *tracer) 4969create_trace_option_files(struct trace_array *tr, struct tracer *tracer)
4892{ 4970{
4893 struct trace_option_dentry *topts; 4971 struct trace_option_dentry *topts;
4894 struct tracer_flags *flags; 4972 struct tracer_flags *flags;
@@ -4913,7 +4991,7 @@ create_trace_option_files(struct tracer *tracer)
4913 return NULL; 4991 return NULL;
4914 4992
4915 for (cnt = 0; opts[cnt].name; cnt++) 4993 for (cnt = 0; opts[cnt].name; cnt++)
4916 create_trace_option_file(&topts[cnt], flags, 4994 create_trace_option_file(tr, &topts[cnt], flags,
4917 &opts[cnt]); 4995 &opts[cnt]);
4918 4996
4919 return topts; 4997 return topts;
@@ -4936,11 +5014,12 @@ destroy_trace_option_files(struct trace_option_dentry *topts)
4936} 5014}
4937 5015
4938static struct dentry * 5016static struct dentry *
4939create_trace_option_core_file(const char *option, long index) 5017create_trace_option_core_file(struct trace_array *tr,
5018 const char *option, long index)
4940{ 5019{
4941 struct dentry *t_options; 5020 struct dentry *t_options;
4942 5021
4943 t_options = trace_options_init_dentry(); 5022 t_options = trace_options_init_dentry(tr);
4944 if (!t_options) 5023 if (!t_options)
4945 return NULL; 5024 return NULL;
4946 5025
@@ -4948,17 +5027,17 @@ create_trace_option_core_file(const char *option, long index)
4948 &trace_options_core_fops); 5027 &trace_options_core_fops);
4949} 5028}
4950 5029
4951static __init void create_trace_options_dir(void) 5030static __init void create_trace_options_dir(struct trace_array *tr)
4952{ 5031{
4953 struct dentry *t_options; 5032 struct dentry *t_options;
4954 int i; 5033 int i;
4955 5034
4956 t_options = trace_options_init_dentry(); 5035 t_options = trace_options_init_dentry(tr);
4957 if (!t_options) 5036 if (!t_options)
4958 return; 5037 return;
4959 5038
4960 for (i = 0; trace_options[i]; i++) 5039 for (i = 0; trace_options[i]; i++)
4961 create_trace_option_core_file(trace_options[i], i); 5040 create_trace_option_core_file(tr, trace_options[i], i);
4962} 5041}
4963 5042
4964static ssize_t 5043static ssize_t
@@ -4997,12 +5076,12 @@ rb_simple_write(struct file *filp, const char __user *ubuf,
4997 mutex_lock(&trace_types_lock); 5076 mutex_lock(&trace_types_lock);
4998 if (val) { 5077 if (val) {
4999 ring_buffer_record_on(buffer); 5078 ring_buffer_record_on(buffer);
5000 if (current_trace->start) 5079 if (tr->current_trace->start)
5001 current_trace->start(tr); 5080 tr->current_trace->start(tr);
5002 } else { 5081 } else {
5003 ring_buffer_record_off(buffer); 5082 ring_buffer_record_off(buffer);
5004 if (current_trace->stop) 5083 if (tr->current_trace->stop)
5005 current_trace->stop(tr); 5084 tr->current_trace->stop(tr);
5006 } 5085 }
5007 mutex_unlock(&trace_types_lock); 5086 mutex_unlock(&trace_types_lock);
5008 } 5087 }
@@ -5019,6 +5098,38 @@ static const struct file_operations rb_simple_fops = {
5019 .llseek = default_llseek, 5098 .llseek = default_llseek,
5020}; 5099};
5021 5100
5101static void
5102init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer)
5103{
5104
5105 trace_create_file("trace_options", 0644, d_tracer,
5106 tr, &tracing_iter_fops);
5107
5108 trace_create_file("trace", 0644, d_tracer,
5109 (void *)&tr->trace_cpu, &tracing_fops);
5110
5111 trace_create_file("trace_pipe", 0444, d_tracer,
5112 (void *)&tr->trace_cpu, &tracing_pipe_fops);
5113
5114 trace_create_file("buffer_size_kb", 0644, d_tracer,
5115 (void *)&tr->trace_cpu, &tracing_entries_fops);
5116
5117 trace_create_file("buffer_total_size_kb", 0444, d_tracer,
5118 tr, &tracing_total_entries_fops);
5119
5120 trace_create_file("free_buffer", 0644, d_tracer,
5121 tr, &tracing_free_buffer_fops);
5122
5123 trace_create_file("trace_marker", 0220, d_tracer,
5124 tr, &tracing_mark_fops);
5125
5126 trace_create_file("trace_clock", 0644, d_tracer, tr,
5127 &trace_clock_fops);
5128
5129 trace_create_file("tracing_on", 0644, d_tracer,
5130 tr, &rb_simple_fops);
5131}
5132
5022static __init int tracer_init_debugfs(void) 5133static __init int tracer_init_debugfs(void)
5023{ 5134{
5024 struct dentry *d_tracer; 5135 struct dentry *d_tracer;
@@ -5028,14 +5139,10 @@ static __init int tracer_init_debugfs(void)
5028 5139
5029 d_tracer = tracing_init_dentry(); 5140 d_tracer = tracing_init_dentry();
5030 5141
5031 trace_create_file("trace_options", 0644, d_tracer, 5142 init_tracer_debugfs(&global_trace, d_tracer);
5032 NULL, &tracing_iter_fops);
5033 5143
5034 trace_create_file("tracing_cpumask", 0644, d_tracer, 5144 trace_create_file("tracing_cpumask", 0644, d_tracer,
5035 NULL, &tracing_cpumask_fops); 5145 &global_trace, &tracing_cpumask_fops);
5036
5037 trace_create_file("trace", 0644, d_tracer,
5038 (void *) RING_BUFFER_ALL_CPUS, &tracing_fops);
5039 5146
5040 trace_create_file("available_tracers", 0444, d_tracer, 5147 trace_create_file("available_tracers", 0444, d_tracer,
5041 &global_trace, &show_traces_fops); 5148 &global_trace, &show_traces_fops);
@@ -5054,30 +5161,9 @@ static __init int tracer_init_debugfs(void)
5054 trace_create_file("README", 0444, d_tracer, 5161 trace_create_file("README", 0444, d_tracer,
5055 NULL, &tracing_readme_fops); 5162 NULL, &tracing_readme_fops);
5056 5163
5057 trace_create_file("trace_pipe", 0444, d_tracer,
5058 (void *) RING_BUFFER_ALL_CPUS, &tracing_pipe_fops);
5059
5060 trace_create_file("buffer_size_kb", 0644, d_tracer,
5061 (void *) RING_BUFFER_ALL_CPUS, &tracing_entries_fops);
5062
5063 trace_create_file("buffer_total_size_kb", 0444, d_tracer,
5064 &global_trace, &tracing_total_entries_fops);
5065
5066 trace_create_file("free_buffer", 0644, d_tracer,
5067 &global_trace, &tracing_free_buffer_fops);
5068
5069 trace_create_file("trace_marker", 0220, d_tracer,
5070 NULL, &tracing_mark_fops);
5071
5072 trace_create_file("saved_cmdlines", 0444, d_tracer, 5164 trace_create_file("saved_cmdlines", 0444, d_tracer,
5073 NULL, &tracing_saved_cmdlines_fops); 5165 NULL, &tracing_saved_cmdlines_fops);
5074 5166
5075 trace_create_file("trace_clock", 0644, d_tracer, NULL,
5076 &trace_clock_fops);
5077
5078 trace_create_file("tracing_on", 0644, d_tracer,
5079 &global_trace, &rb_simple_fops);
5080
5081#ifdef CONFIG_DYNAMIC_FTRACE 5167#ifdef CONFIG_DYNAMIC_FTRACE
5082 trace_create_file("dyn_ftrace_total_info", 0444, d_tracer, 5168 trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
5083 &ftrace_update_tot_cnt, &tracing_dyn_info_fops); 5169 &ftrace_update_tot_cnt, &tracing_dyn_info_fops);
@@ -5085,13 +5171,13 @@ static __init int tracer_init_debugfs(void)
5085 5171
5086#ifdef CONFIG_TRACER_SNAPSHOT 5172#ifdef CONFIG_TRACER_SNAPSHOT
5087 trace_create_file("snapshot", 0644, d_tracer, 5173 trace_create_file("snapshot", 0644, d_tracer,
5088 (void *) RING_BUFFER_ALL_CPUS, &snapshot_fops); 5174 (void *)&global_trace.trace_cpu, &snapshot_fops);
5089#endif 5175#endif
5090 5176
5091 create_trace_options_dir(); 5177 create_trace_options_dir(&global_trace);
5092 5178
5093 for_each_tracing_cpu(cpu) 5179 for_each_tracing_cpu(cpu)
5094 tracing_init_debugfs_percpu(cpu); 5180 tracing_init_debugfs_percpu(&global_trace, cpu);
5095 5181
5096 return 0; 5182 return 0;
5097} 5183}
@@ -5161,7 +5247,7 @@ trace_printk_seq(struct trace_seq *s)
5161void trace_init_global_iter(struct trace_iterator *iter) 5247void trace_init_global_iter(struct trace_iterator *iter)
5162{ 5248{
5163 iter->tr = &global_trace; 5249 iter->tr = &global_trace;
5164 iter->trace = current_trace; 5250 iter->trace = iter->tr->current_trace;
5165 iter->cpu_file = RING_BUFFER_ALL_CPUS; 5251 iter->cpu_file = RING_BUFFER_ALL_CPUS;
5166} 5252}
5167 5253
@@ -5315,6 +5401,8 @@ __init static int tracer_alloc_buffers(void)
5315 cpumask_copy(tracing_buffer_mask, cpu_possible_mask); 5401 cpumask_copy(tracing_buffer_mask, cpu_possible_mask);
5316 cpumask_copy(tracing_cpumask, cpu_all_mask); 5402 cpumask_copy(tracing_cpumask, cpu_all_mask);
5317 5403
5404 raw_spin_lock_init(&global_trace.start_lock);
5405
5318 /* TODO: make the number of buffers hot pluggable with CPUS */ 5406 /* TODO: make the number of buffers hot pluggable with CPUS */
5319 global_trace.buffer = ring_buffer_alloc(ring_buf_size, rb_flags); 5407 global_trace.buffer = ring_buffer_alloc(ring_buf_size, rb_flags);
5320 if (!global_trace.buffer) { 5408 if (!global_trace.buffer) {
@@ -5328,6 +5416,7 @@ __init static int tracer_alloc_buffers(void)
5328 5416
5329#ifdef CONFIG_TRACER_MAX_TRACE 5417#ifdef CONFIG_TRACER_MAX_TRACE
5330 max_tr.buffer = ring_buffer_alloc(1, rb_flags); 5418 max_tr.buffer = ring_buffer_alloc(1, rb_flags);
5419 raw_spin_lock_init(&max_tr.start_lock);
5331 if (!max_tr.buffer) { 5420 if (!max_tr.buffer) {
5332 printk(KERN_ERR "tracer: failed to allocate max ring buffer!\n"); 5421 printk(KERN_ERR "tracer: failed to allocate max ring buffer!\n");
5333 WARN_ON(1); 5422 WARN_ON(1);
@@ -5339,7 +5428,11 @@ __init static int tracer_alloc_buffers(void)
5339 /* Allocate the first page for all buffers */ 5428 /* Allocate the first page for all buffers */
5340 for_each_tracing_cpu(i) { 5429 for_each_tracing_cpu(i) {
5341 global_trace.data[i] = &per_cpu(global_trace_cpu, i); 5430 global_trace.data[i] = &per_cpu(global_trace_cpu, i);
5431 global_trace.data[i]->trace_cpu.cpu = i;
5432 global_trace.data[i]->trace_cpu.tr = &global_trace;
5342 max_tr.data[i] = &per_cpu(max_tr_data, i); 5433 max_tr.data[i] = &per_cpu(max_tr_data, i);
5434 max_tr.data[i]->trace_cpu.cpu = i;
5435 max_tr.data[i]->trace_cpu.tr = &max_tr;
5343 } 5436 }
5344 5437
5345 set_buffer_entries(&global_trace, 5438 set_buffer_entries(&global_trace,
@@ -5353,6 +5446,8 @@ __init static int tracer_alloc_buffers(void)
5353 5446
5354 register_tracer(&nop_trace); 5447 register_tracer(&nop_trace);
5355 5448
5449 global_trace.current_trace = &nop_trace;
5450
5356 /* All seems OK, enable tracing */ 5451 /* All seems OK, enable tracing */
5357 tracing_disabled = 0; 5452 tracing_disabled = 0;
5358 5453
@@ -5363,6 +5458,10 @@ __init static int tracer_alloc_buffers(void)
5363 5458
5364 global_trace.flags = TRACE_ARRAY_FL_GLOBAL; 5459 global_trace.flags = TRACE_ARRAY_FL_GLOBAL;
5365 5460
5461 /* Holder for file callbacks */
5462 global_trace.trace_cpu.cpu = RING_BUFFER_ALL_CPUS;
5463 global_trace.trace_cpu.tr = &global_trace;
5464
5366 INIT_LIST_HEAD(&global_trace.systems); 5465 INIT_LIST_HEAD(&global_trace.systems);
5367 INIT_LIST_HEAD(&global_trace.events); 5466 INIT_LIST_HEAD(&global_trace.events);
5368 list_add(&global_trace.list, &ftrace_trace_arrays); 5467 list_add(&global_trace.list, &ftrace_trace_arrays);
@@ -5371,7 +5470,7 @@ __init static int tracer_alloc_buffers(void)
5371 char *option; 5470 char *option;
5372 5471
5373 option = strsep(&trace_boot_options, ","); 5472 option = strsep(&trace_boot_options, ",");
5374 trace_set_options(option); 5473 trace_set_options(&global_trace, option);
5375 } 5474 }
5376 5475
5377 return 0; 5476 return 0;
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index da09a037abcd..b80fbcf70af4 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -127,12 +127,21 @@ enum trace_flag_type {
127 127
128#define TRACE_BUF_SIZE 1024 128#define TRACE_BUF_SIZE 1024
129 129
130struct trace_array;
131
132struct trace_cpu {
133 struct trace_array *tr;
134 struct dentry *dir;
135 int cpu;
136};
137
130/* 138/*
131 * The CPU trace array - it consists of thousands of trace entries 139 * The CPU trace array - it consists of thousands of trace entries
132 * plus some other descriptor data: (for example which task started 140 * plus some other descriptor data: (for example which task started
133 * the trace, etc.) 141 * the trace, etc.)
134 */ 142 */
135struct trace_array_cpu { 143struct trace_array_cpu {
144 struct trace_cpu trace_cpu;
136 atomic_t disabled; 145 atomic_t disabled;
137 void *buffer_page; /* ring buffer spare */ 146 void *buffer_page; /* ring buffer spare */
138 147
@@ -151,6 +160,8 @@ struct trace_array_cpu {
151 char comm[TASK_COMM_LEN]; 160 char comm[TASK_COMM_LEN];
152}; 161};
153 162
163struct tracer;
164
154/* 165/*
155 * The trace array - an array of per-CPU trace arrays. This is the 166 * The trace array - an array of per-CPU trace arrays. This is the
156 * highest level data structure that individual tracers deal with. 167 * highest level data structure that individual tracers deal with.
@@ -161,9 +172,16 @@ struct trace_array {
161 struct list_head list; 172 struct list_head list;
162 int cpu; 173 int cpu;
163 int buffer_disabled; 174 int buffer_disabled;
175 struct trace_cpu trace_cpu; /* place holder */
176 int stop_count;
177 int clock_id;
178 struct tracer *current_trace;
164 unsigned int flags; 179 unsigned int flags;
165 cycle_t time_start; 180 cycle_t time_start;
181 raw_spinlock_t start_lock;
166 struct dentry *dir; 182 struct dentry *dir;
183 struct dentry *options;
184 struct dentry *percpu_dir;
167 struct dentry *event_dir; 185 struct dentry *event_dir;
168 struct list_head systems; 186 struct list_head systems;
169 struct list_head events; 187 struct list_head events;
@@ -474,6 +492,7 @@ struct dentry *trace_create_file(const char *name,
474 void *data, 492 void *data,
475 const struct file_operations *fops); 493 const struct file_operations *fops);
476 494
495struct dentry *tracing_init_dentry_tr(struct trace_array *tr);
477struct dentry *tracing_init_dentry(void); 496struct dentry *tracing_init_dentry(void);
478 497
479struct ring_buffer_event; 498struct ring_buffer_event;
@@ -979,7 +998,7 @@ extern const char *__stop___trace_bprintk_fmt[];
979void trace_printk_init_buffers(void); 998void trace_printk_init_buffers(void);
980void trace_printk_start_comm(void); 999void trace_printk_start_comm(void);
981int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set); 1000int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set);
982int set_tracer_flag(unsigned int mask, int enabled); 1001int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled);
983 1002
984#undef FTRACE_ENTRY 1003#undef FTRACE_ENTRY
985#define FTRACE_ENTRY(call, struct_name, id, tstruct, print, filter) \ 1004#define FTRACE_ENTRY(call, struct_name, id, tstruct, print, filter) \
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
index 443b25b43b4f..b3cf6bf308ef 100644
--- a/kernel/trace/trace_irqsoff.c
+++ b/kernel/trace/trace_irqsoff.c
@@ -561,8 +561,8 @@ static void __irqsoff_tracer_init(struct trace_array *tr)
561 save_flags = trace_flags; 561 save_flags = trace_flags;
562 562
563 /* non overwrite screws up the latency tracers */ 563 /* non overwrite screws up the latency tracers */
564 set_tracer_flag(TRACE_ITER_OVERWRITE, 1); 564 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
565 set_tracer_flag(TRACE_ITER_LATENCY_FMT, 1); 565 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
566 566
567 tracing_max_latency = 0; 567 tracing_max_latency = 0;
568 irqsoff_trace = tr; 568 irqsoff_trace = tr;
@@ -581,8 +581,8 @@ static void irqsoff_tracer_reset(struct trace_array *tr)
581 581
582 stop_irqsoff_tracer(tr, is_graph()); 582 stop_irqsoff_tracer(tr, is_graph());
583 583
584 set_tracer_flag(TRACE_ITER_LATENCY_FMT, lat_flag); 584 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag);
585 set_tracer_flag(TRACE_ITER_OVERWRITE, overwrite_flag); 585 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag);
586} 586}
587 587
588static void irqsoff_tracer_start(struct trace_array *tr) 588static void irqsoff_tracer_start(struct trace_array *tr)
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c
index fde652c9a511..5255a8477247 100644
--- a/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/trace/trace_sched_wakeup.c
@@ -543,8 +543,8 @@ static int __wakeup_tracer_init(struct trace_array *tr)
543 save_flags = trace_flags; 543 save_flags = trace_flags;
544 544
545 /* non overwrite screws up the latency tracers */ 545 /* non overwrite screws up the latency tracers */
546 set_tracer_flag(TRACE_ITER_OVERWRITE, 1); 546 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
547 set_tracer_flag(TRACE_ITER_LATENCY_FMT, 1); 547 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
548 548
549 tracing_max_latency = 0; 549 tracing_max_latency = 0;
550 wakeup_trace = tr; 550 wakeup_trace = tr;
@@ -573,8 +573,8 @@ static void wakeup_tracer_reset(struct trace_array *tr)
573 /* make sure we put back any tasks we are tracing */ 573 /* make sure we put back any tasks we are tracing */
574 wakeup_reset(tr); 574 wakeup_reset(tr);
575 575
576 set_tracer_flag(TRACE_ITER_LATENCY_FMT, lat_flag); 576 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag);
577 set_tracer_flag(TRACE_ITER_OVERWRITE, overwrite_flag); 577 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag);
578} 578}
579 579
580static void wakeup_tracer_start(struct trace_array *tr) 580static void wakeup_tracer_start(struct trace_array *tr)