aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_irqsoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_irqsoff.c')
-rw-r--r--kernel/trace/trace_irqsoff.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
index 8b1231633dc5..bd3f88198308 100644
--- a/kernel/trace/trace_irqsoff.c
+++ b/kernel/trace/trace_irqsoff.c
@@ -74,12 +74,21 @@ irqsoff_tracer_call(unsigned long ip, unsigned long parent_ip)
74 long disabled; 74 long disabled;
75 int cpu; 75 int cpu;
76 76
77 if (likely(!__get_cpu_var(tracing_cpu))) 77 /*
78 * Does not matter if we preempt. We test the flags
79 * afterward, to see if irqs are disabled or not.
80 * If we preempt and get a false positive, the flags
81 * test will fail.
82 */
83 cpu = raw_smp_processor_id();
84 if (likely(!per_cpu(tracing_cpu, cpu)))
78 return; 85 return;
79 86
80 local_save_flags(flags); 87 local_save_flags(flags);
88 /* slight chance to get a false positive on tracing_cpu */
89 if (!irqs_disabled_flags(flags))
90 return;
81 91
82 cpu = raw_smp_processor_id();
83 data = tr->data[cpu]; 92 data = tr->data[cpu];
84 disabled = atomic_inc_return(&data->disabled); 93 disabled = atomic_inc_return(&data->disabled);
85 94