diff options
Diffstat (limited to 'kernel/trace/trace_branch.c')
-rw-r--r-- | kernel/trace/trace_branch.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index a87b43f49eb4..e2e12ad3186f 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c | |||
@@ -36,9 +36,12 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
36 | struct trace_branch *entry; | 36 | struct trace_branch *entry; |
37 | struct ring_buffer *buffer; | 37 | struct ring_buffer *buffer; |
38 | unsigned long flags; | 38 | unsigned long flags; |
39 | int cpu, pc; | 39 | int pc; |
40 | const char *p; | 40 | const char *p; |
41 | 41 | ||
42 | if (current->trace_recursion & TRACE_BRANCH_BIT) | ||
43 | return; | ||
44 | |||
42 | /* | 45 | /* |
43 | * I would love to save just the ftrace_likely_data pointer, but | 46 | * I would love to save just the ftrace_likely_data pointer, but |
44 | * this code can also be used by modules. Ugly things can happen | 47 | * this code can also be used by modules. Ugly things can happen |
@@ -49,10 +52,10 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
49 | if (unlikely(!tr)) | 52 | if (unlikely(!tr)) |
50 | return; | 53 | return; |
51 | 54 | ||
52 | local_irq_save(flags); | 55 | raw_local_irq_save(flags); |
53 | cpu = raw_smp_processor_id(); | 56 | current->trace_recursion |= TRACE_BRANCH_BIT; |
54 | data = per_cpu_ptr(tr->trace_buffer.data, cpu); | 57 | data = this_cpu_ptr(tr->trace_buffer.data); |
55 | if (atomic_inc_return(&data->disabled) != 1) | 58 | if (atomic_read(&data->disabled)) |
56 | goto out; | 59 | goto out; |
57 | 60 | ||
58 | pc = preempt_count(); | 61 | pc = preempt_count(); |
@@ -81,8 +84,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
81 | __buffer_unlock_commit(buffer, event); | 84 | __buffer_unlock_commit(buffer, event); |
82 | 85 | ||
83 | out: | 86 | out: |
84 | atomic_dec(&data->disabled); | 87 | current->trace_recursion &= ~TRACE_BRANCH_BIT; |
85 | local_irq_restore(flags); | 88 | raw_local_irq_restore(flags); |
86 | } | 89 | } |
87 | 90 | ||
88 | static inline | 91 | static inline |