diff options
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/trace_functions.c | 61 |
1 files changed, 14 insertions, 47 deletions
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index 8e3ad8082ab7..1c327ef13a9a 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c | |||
@@ -47,34 +47,6 @@ static void function_trace_start(struct trace_array *tr) | |||
47 | tracing_reset_online_cpus(tr); | 47 | tracing_reset_online_cpus(tr); |
48 | } | 48 | } |
49 | 49 | ||
50 | static void | ||
51 | function_trace_call_preempt_only(unsigned long ip, unsigned long parent_ip, | ||
52 | struct ftrace_ops *op, struct pt_regs *pt_regs) | ||
53 | { | ||
54 | struct trace_array *tr = func_trace; | ||
55 | struct trace_array_cpu *data; | ||
56 | unsigned long flags; | ||
57 | long disabled; | ||
58 | int cpu; | ||
59 | int pc; | ||
60 | |||
61 | if (unlikely(!ftrace_function_enabled)) | ||
62 | return; | ||
63 | |||
64 | pc = preempt_count(); | ||
65 | preempt_disable_notrace(); | ||
66 | local_save_flags(flags); | ||
67 | cpu = raw_smp_processor_id(); | ||
68 | data = tr->data[cpu]; | ||
69 | disabled = atomic_inc_return(&data->disabled); | ||
70 | |||
71 | if (likely(disabled == 1)) | ||
72 | trace_function(tr, ip, parent_ip, flags, pc); | ||
73 | |||
74 | atomic_dec(&data->disabled); | ||
75 | preempt_enable_notrace(); | ||
76 | } | ||
77 | |||
78 | /* Our option */ | 50 | /* Our option */ |
79 | enum { | 51 | enum { |
80 | TRACE_FUNC_OPT_STACK = 0x1, | 52 | TRACE_FUNC_OPT_STACK = 0x1, |
@@ -85,34 +57,34 @@ static struct tracer_flags func_flags; | |||
85 | static void | 57 | static void |
86 | function_trace_call(unsigned long ip, unsigned long parent_ip, | 58 | function_trace_call(unsigned long ip, unsigned long parent_ip, |
87 | struct ftrace_ops *op, struct pt_regs *pt_regs) | 59 | struct ftrace_ops *op, struct pt_regs *pt_regs) |
88 | |||
89 | { | 60 | { |
90 | struct trace_array *tr = func_trace; | 61 | struct trace_array *tr = func_trace; |
91 | struct trace_array_cpu *data; | 62 | struct trace_array_cpu *data; |
92 | unsigned long flags; | 63 | unsigned long flags; |
93 | long disabled; | 64 | unsigned int bit; |
94 | int cpu; | 65 | int cpu; |
95 | int pc; | 66 | int pc; |
96 | 67 | ||
97 | if (unlikely(!ftrace_function_enabled)) | 68 | if (unlikely(!ftrace_function_enabled)) |
98 | return; | 69 | return; |
99 | 70 | ||
100 | /* | 71 | pc = preempt_count(); |
101 | * Need to use raw, since this must be called before the | 72 | preempt_disable_notrace(); |
102 | * recursive protection is performed. | ||
103 | */ | ||
104 | local_irq_save(flags); | ||
105 | cpu = raw_smp_processor_id(); | ||
106 | data = tr->data[cpu]; | ||
107 | disabled = atomic_inc_return(&data->disabled); | ||
108 | 73 | ||
109 | if (likely(disabled == 1)) { | 74 | bit = trace_test_and_set_recursion(TRACE_FTRACE_START, TRACE_FTRACE_MAX); |
110 | pc = preempt_count(); | 75 | if (bit < 0) |
76 | goto out; | ||
77 | |||
78 | cpu = smp_processor_id(); | ||
79 | data = tr->data[cpu]; | ||
80 | if (!atomic_read(&data->disabled)) { | ||
81 | local_save_flags(flags); | ||
111 | trace_function(tr, ip, parent_ip, flags, pc); | 82 | trace_function(tr, ip, parent_ip, flags, pc); |
112 | } | 83 | } |
84 | trace_clear_recursion(bit); | ||
113 | 85 | ||
114 | atomic_dec(&data->disabled); | 86 | out: |
115 | local_irq_restore(flags); | 87 | preempt_enable_notrace(); |
116 | } | 88 | } |
117 | 89 | ||
118 | static void | 90 | static void |
@@ -185,11 +157,6 @@ static void tracing_start_function_trace(void) | |||
185 | { | 157 | { |
186 | ftrace_function_enabled = 0; | 158 | ftrace_function_enabled = 0; |
187 | 159 | ||
188 | if (trace_flags & TRACE_ITER_PREEMPTONLY) | ||
189 | trace_ops.func = function_trace_call_preempt_only; | ||
190 | else | ||
191 | trace_ops.func = function_trace_call; | ||
192 | |||
193 | if (func_flags.val & TRACE_FUNC_OPT_STACK) | 160 | if (func_flags.val & TRACE_FUNC_OPT_STACK) |
194 | register_ftrace_function(&trace_stack_ops); | 161 | register_ftrace_function(&trace_stack_ops); |
195 | else | 162 | else |