hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/kernel/trace/trace_irqsoff.c
....@@ -14,6 +14,7 @@
1414 #include <linux/uaccess.h>
1515 #include <linux/module.h>
1616 #include <linux/ftrace.h>
17
+#include <linux/irqstage.h>
1718 #include <linux/kprobes.h>
1819
1920 #include "trace.h"
....@@ -26,7 +27,7 @@
2627
2728 static DEFINE_PER_CPU(int, tracing_cpu);
2829
29
-static DEFINE_RAW_SPINLOCK(max_trace_lock);
30
+static DEFINE_HARD_SPINLOCK(max_trace_lock);
3031
3132 enum {
3233 TRACER_IRQS_OFF = (1 << 1),
....@@ -44,7 +45,7 @@
4445 static inline int
4546 preempt_trace(int pc)
4647 {
47
- return ((trace_type & TRACER_PREEMPT_OFF) && pc);
48
+ return (running_inband() && (trace_type & TRACER_PREEMPT_OFF) && pc);
4849 }
4950 #else
5051 # define preempt_trace(pc) (0)
....@@ -55,7 +56,7 @@
5556 irq_trace(void)
5657 {
5758 return ((trace_type & TRACER_IRQS_OFF) &&
58
- irqs_disabled());
59
+ (hard_irqs_disabled() || (running_inband() && irqs_disabled())));
5960 }
6061 #else
6162 # define irq_trace() (0)
....@@ -393,7 +394,7 @@
393394 data->preempt_timestamp = ftrace_now(cpu);
394395 data->critical_start = parent_ip ? : ip;
395396
396
- local_save_flags(flags);
397
+ stage_save_flags(flags);
397398
398399 __trace_function(tr, ip, parent_ip, flags, pc);
399400
....@@ -428,7 +429,7 @@
428429
429430 atomic_inc(&data->disabled);
430431
431
- local_save_flags(flags);
432
+ stage_save_flags(flags);
432433 __trace_function(tr, ip, parent_ip, flags, pc);
433434 check_critical_timing(tr, data, parent_ip ? : ip, cpu);
434435 data->critical_start = 0;