| .. | .. |
|---|
| 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; |
|---|