diff options
Diffstat (limited to 'kernel/trace/trace_irqsoff.c')
| -rw-r--r-- | kernel/trace/trace_irqsoff.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c index b923d13e2fad..3aa7eaa2114c 100644 --- a/kernel/trace/trace_irqsoff.c +++ b/kernel/trace/trace_irqsoff.c | |||
| @@ -129,15 +129,10 @@ check_critical_timing(struct trace_array *tr, | |||
| 129 | unsigned long parent_ip, | 129 | unsigned long parent_ip, |
| 130 | int cpu) | 130 | int cpu) |
| 131 | { | 131 | { |
| 132 | unsigned long latency, t0, t1; | ||
| 133 | cycle_t T0, T1, delta; | 132 | cycle_t T0, T1, delta; |
| 134 | unsigned long flags; | 133 | unsigned long flags; |
| 135 | int pc; | 134 | int pc; |
| 136 | 135 | ||
| 137 | /* | ||
| 138 | * usecs conversion is slow so we try to delay the conversion | ||
| 139 | * as long as possible: | ||
| 140 | */ | ||
| 141 | T0 = data->preempt_timestamp; | 136 | T0 = data->preempt_timestamp; |
| 142 | T1 = ftrace_now(cpu); | 137 | T1 = ftrace_now(cpu); |
| 143 | delta = T1-T0; | 138 | delta = T1-T0; |
| @@ -157,18 +152,15 @@ check_critical_timing(struct trace_array *tr, | |||
| 157 | 152 | ||
| 158 | trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); | 153 | trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); |
| 159 | 154 | ||
| 160 | latency = nsecs_to_usecs(delta); | ||
| 161 | |||
| 162 | if (data->critical_sequence != max_sequence) | 155 | if (data->critical_sequence != max_sequence) |
| 163 | goto out_unlock; | 156 | goto out_unlock; |
| 164 | 157 | ||
| 165 | tracing_max_latency = delta; | ||
| 166 | t0 = nsecs_to_usecs(T0); | ||
| 167 | t1 = nsecs_to_usecs(T1); | ||
| 168 | |||
| 169 | data->critical_end = parent_ip; | 158 | data->critical_end = parent_ip; |
| 170 | 159 | ||
| 171 | update_max_tr_single(tr, current, cpu); | 160 | if (likely(!is_tracing_stopped())) { |
| 161 | tracing_max_latency = delta; | ||
| 162 | update_max_tr_single(tr, current, cpu); | ||
| 163 | } | ||
| 172 | 164 | ||
| 173 | max_sequence++; | 165 | max_sequence++; |
| 174 | 166 | ||
| @@ -178,7 +170,6 @@ out_unlock: | |||
| 178 | out: | 170 | out: |
| 179 | data->critical_sequence = max_sequence; | 171 | data->critical_sequence = max_sequence; |
| 180 | data->preempt_timestamp = ftrace_now(cpu); | 172 | data->preempt_timestamp = ftrace_now(cpu); |
| 181 | tracing_reset(tr, cpu); | ||
| 182 | trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); | 173 | trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); |
| 183 | } | 174 | } |
| 184 | 175 | ||
| @@ -208,7 +199,6 @@ start_critical_timing(unsigned long ip, unsigned long parent_ip) | |||
| 208 | data->critical_sequence = max_sequence; | 199 | data->critical_sequence = max_sequence; |
| 209 | data->preempt_timestamp = ftrace_now(cpu); | 200 | data->preempt_timestamp = ftrace_now(cpu); |
| 210 | data->critical_start = parent_ip ? : ip; | 201 | data->critical_start = parent_ip ? : ip; |
| 211 | tracing_reset(tr, cpu); | ||
| 212 | 202 | ||
| 213 | local_save_flags(flags); | 203 | local_save_flags(flags); |
| 214 | 204 | ||
| @@ -379,6 +369,7 @@ static void __irqsoff_tracer_init(struct trace_array *tr) | |||
| 379 | irqsoff_trace = tr; | 369 | irqsoff_trace = tr; |
| 380 | /* make sure that the tracer is visible */ | 370 | /* make sure that the tracer is visible */ |
| 381 | smp_wmb(); | 371 | smp_wmb(); |
| 372 | tracing_reset_online_cpus(tr); | ||
| 382 | start_irqsoff_tracer(tr); | 373 | start_irqsoff_tracer(tr); |
| 383 | } | 374 | } |
| 384 | 375 | ||
