.. | .. |
---|
14 | 14 | #include <linux/uaccess.h> |
---|
15 | 15 | #include <linux/module.h> |
---|
16 | 16 | #include <linux/ftrace.h> |
---|
| 17 | +#include <linux/irqstage.h> |
---|
17 | 18 | #include <linux/kprobes.h> |
---|
18 | 19 | |
---|
19 | 20 | #include "trace.h" |
---|
.. | .. |
---|
26 | 27 | |
---|
27 | 28 | static DEFINE_PER_CPU(int, tracing_cpu); |
---|
28 | 29 | |
---|
29 | | -static DEFINE_RAW_SPINLOCK(max_trace_lock); |
---|
| 30 | +static DEFINE_HARD_SPINLOCK(max_trace_lock); |
---|
30 | 31 | |
---|
31 | 32 | enum { |
---|
32 | 33 | TRACER_IRQS_OFF = (1 << 1), |
---|
.. | .. |
---|
44 | 45 | static inline int |
---|
45 | 46 | preempt_trace(int pc) |
---|
46 | 47 | { |
---|
47 | | - return ((trace_type & TRACER_PREEMPT_OFF) && pc); |
---|
| 48 | + return (running_inband() && (trace_type & TRACER_PREEMPT_OFF) && pc); |
---|
48 | 49 | } |
---|
49 | 50 | #else |
---|
50 | 51 | # define preempt_trace(pc) (0) |
---|
.. | .. |
---|
55 | 56 | irq_trace(void) |
---|
56 | 57 | { |
---|
57 | 58 | return ((trace_type & TRACER_IRQS_OFF) && |
---|
58 | | - irqs_disabled()); |
---|
| 59 | + (hard_irqs_disabled() || (running_inband() && irqs_disabled()))); |
---|
59 | 60 | } |
---|
60 | 61 | #else |
---|
61 | 62 | # define irq_trace() (0) |
---|
.. | .. |
---|
393 | 394 | data->preempt_timestamp = ftrace_now(cpu); |
---|
394 | 395 | data->critical_start = parent_ip ? : ip; |
---|
395 | 396 | |
---|
396 | | - local_save_flags(flags); |
---|
| 397 | + stage_save_flags(flags); |
---|
397 | 398 | |
---|
398 | 399 | __trace_function(tr, ip, parent_ip, flags, pc); |
---|
399 | 400 | |
---|
.. | .. |
---|
428 | 429 | |
---|
429 | 430 | atomic_inc(&data->disabled); |
---|
430 | 431 | |
---|
431 | | - local_save_flags(flags); |
---|
| 432 | + stage_save_flags(flags); |
---|
432 | 433 | __trace_function(tr, ip, parent_ip, flags, pc); |
---|
433 | 434 | check_critical_timing(tr, data, parent_ip ? : ip, cpu); |
---|
434 | 435 | data->critical_start = 0; |
---|