diff options
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 8b6409a62b54..710b39acd81b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1209,6 +1209,9 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) | |||
1209 | int cpu; | 1209 | int cpu; |
1210 | int pc; | 1210 | int pc; |
1211 | 1211 | ||
1212 | if (!ftrace_graph_addr(trace->func)) | ||
1213 | return 0; | ||
1214 | |||
1212 | local_irq_save(flags); | 1215 | local_irq_save(flags); |
1213 | cpu = raw_smp_processor_id(); | 1216 | cpu = raw_smp_processor_id(); |
1214 | data = tr->data[cpu]; | 1217 | data = tr->data[cpu]; |
@@ -1217,6 +1220,9 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) | |||
1217 | pc = preempt_count(); | 1220 | pc = preempt_count(); |
1218 | __trace_graph_entry(tr, data, trace, flags, pc); | 1221 | __trace_graph_entry(tr, data, trace, flags, pc); |
1219 | } | 1222 | } |
1223 | /* Only do the atomic if it is not already set */ | ||
1224 | if (!test_tsk_trace_graph(current)) | ||
1225 | set_tsk_trace_graph(current); | ||
1220 | atomic_dec(&data->disabled); | 1226 | atomic_dec(&data->disabled); |
1221 | local_irq_restore(flags); | 1227 | local_irq_restore(flags); |
1222 | 1228 | ||
@@ -1240,6 +1246,8 @@ void trace_graph_return(struct ftrace_graph_ret *trace) | |||
1240 | pc = preempt_count(); | 1246 | pc = preempt_count(); |
1241 | __trace_graph_return(tr, data, trace, flags, pc); | 1247 | __trace_graph_return(tr, data, trace, flags, pc); |
1242 | } | 1248 | } |
1249 | if (!trace->depth) | ||
1250 | clear_tsk_trace_graph(current); | ||
1243 | atomic_dec(&data->disabled); | 1251 | atomic_dec(&data->disabled); |
1244 | local_irq_restore(flags); | 1252 | local_irq_restore(flags); |
1245 | } | 1253 | } |