Blame view
kernel/trace/trace_preemptirq.c
4.22 KB
c3bc8fd63 tracing: Centrali... |
1 2 3 4 5 6 7 8 9 10 11 |
// SPDX-License-Identifier: GPL-2.0 /* * preemptoff and irqoff tracepoints * * Copyright (C) Joel Fernandes (Google) <joel@joelfernandes.org> */ #include <linux/kallsyms.h> #include <linux/uaccess.h> #include <linux/module.h> #include <linux/ftrace.h> |
eeeb080ba kprobes: Prohibit... |
12 |
#include <linux/kprobes.h> |
3f1756dc2 tracing: More rev... |
13 |
#include "trace.h" |
c3bc8fd63 tracing: Centrali... |
14 15 16 |
#define CREATE_TRACE_POINTS #include <trace/events/preemptirq.h> |
2e14f01dc ANDROID: tracing:... |
17 18 |
#undef CREATE_TRACE_POINTS #include <trace/hooks/preemptirq.h> |
c3bc8fd63 tracing: Centrali... |
19 20 21 22 |
#ifdef CONFIG_TRACE_IRQFLAGS /* Per-cpu variable to prevent redundant calls when IRQs already off */ static DEFINE_PER_CPU(int, tracing_irq_cpu); |
0995a5dfb tracing: Provide ... |
23 24 25 26 27 28 29 30 31 |
/* * Like trace_hardirqs_on() but without the lockdep invocation. This is * used in the low level entry code where the ordering vs. RCU is important * and lockdep uses a staged approach which splits the lockdep hardirq * tracking into a RCU on and a RCU off section. */ void trace_hardirqs_on_prepare(void) { if (this_cpu_read(tracing_irq_cpu)) { |
2e14f01dc ANDROID: tracing:... |
32 |
if (!in_nmi()) { |
0995a5dfb tracing: Provide ... |
33 |
trace_irq_enable(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
34 35 36 |
trace_android_rvh_irqs_enable(CALLER_ADDR0, CALLER_ADDR1); } |
0995a5dfb tracing: Provide ... |
37 38 39 40 41 42 |
tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); this_cpu_write(tracing_irq_cpu, 0); } } EXPORT_SYMBOL(trace_hardirqs_on_prepare); NOKPROBE_SYMBOL(trace_hardirqs_on_prepare); |
c3bc8fd63 tracing: Centrali... |
43 44 |
void trace_hardirqs_on(void) { |
bff1b208a tracing: Partial ... |
45 |
if (this_cpu_read(tracing_irq_cpu)) { |
2e14f01dc ANDROID: tracing:... |
46 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
47 |
trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
48 49 50 |
trace_android_rvh_irqs_enable(CALLER_ADDR0, CALLER_ADDR1); } |
3f1756dc2 tracing: More rev... |
51 |
tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1); |
bff1b208a tracing: Partial ... |
52 53 |
this_cpu_write(tracing_irq_cpu, 0); } |
c3bc8fd63 tracing: Centrali... |
54 |
|
c86e9b987 lockdep: Prepare ... |
55 |
lockdep_hardirqs_on_prepare(CALLER_ADDR0); |
bff1b208a tracing: Partial ... |
56 |
lockdep_hardirqs_on(CALLER_ADDR0); |
c3bc8fd63 tracing: Centrali... |
57 58 |
} EXPORT_SYMBOL(trace_hardirqs_on); |
eeeb080ba kprobes: Prohibit... |
59 |
NOKPROBE_SYMBOL(trace_hardirqs_on); |
c3bc8fd63 tracing: Centrali... |
60 |
|
0995a5dfb tracing: Provide ... |
61 62 63 64 65 66 |
/* * Like trace_hardirqs_off() but without the lockdep invocation. This is * used in the low level entry code where the ordering vs. RCU is important * and lockdep uses a staged approach which splits the lockdep hardirq * tracking into a RCU on and a RCU off section. */ |
bf2b30084 x86/entry: Rename... |
67 |
void trace_hardirqs_off_finish(void) |
0995a5dfb tracing: Provide ... |
68 69 70 71 |
{ if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
72 |
if (!in_nmi()) { |
0995a5dfb tracing: Provide ... |
73 |
trace_irq_disable(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
74 75 76 |
trace_android_rvh_irqs_disable(CALLER_ADDR0, CALLER_ADDR1); } |
0995a5dfb tracing: Provide ... |
77 78 79 |
} } |
bf2b30084 x86/entry: Rename... |
80 81 |
EXPORT_SYMBOL(trace_hardirqs_off_finish); NOKPROBE_SYMBOL(trace_hardirqs_off_finish); |
0995a5dfb tracing: Provide ... |
82 |
|
c3bc8fd63 tracing: Centrali... |
83 84 |
void trace_hardirqs_off(void) { |
bf2b30084 x86/entry: Rename... |
85 |
lockdep_hardirqs_off(CALLER_ADDR0); |
bff1b208a tracing: Partial ... |
86 87 |
if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); |
3f1756dc2 tracing: More rev... |
88 |
tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
89 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
90 |
trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1); |
2e14f01dc ANDROID: tracing:... |
91 92 93 |
trace_android_rvh_irqs_disable(CALLER_ADDR0, CALLER_ADDR1); } |
bff1b208a tracing: Partial ... |
94 |
} |
c3bc8fd63 tracing: Centrali... |
95 96 |
} EXPORT_SYMBOL(trace_hardirqs_off); |
eeeb080ba kprobes: Prohibit... |
97 |
NOKPROBE_SYMBOL(trace_hardirqs_off); |
c3bc8fd63 tracing: Centrali... |
98 99 100 |
__visible void trace_hardirqs_on_caller(unsigned long caller_addr) { |
bff1b208a tracing: Partial ... |
101 |
if (this_cpu_read(tracing_irq_cpu)) { |
2e14f01dc ANDROID: tracing:... |
102 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
103 |
trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr); |
2e14f01dc ANDROID: tracing:... |
104 105 106 |
trace_android_rvh_irqs_enable(CALLER_ADDR0, caller_addr); } |
3f1756dc2 tracing: More rev... |
107 |
tracer_hardirqs_on(CALLER_ADDR0, caller_addr); |
bff1b208a tracing: Partial ... |
108 109 |
this_cpu_write(tracing_irq_cpu, 0); } |
c3bc8fd63 tracing: Centrali... |
110 |
|
c86e9b987 lockdep: Prepare ... |
111 |
lockdep_hardirqs_on_prepare(CALLER_ADDR0); |
bff1b208a tracing: Partial ... |
112 |
lockdep_hardirqs_on(CALLER_ADDR0); |
c3bc8fd63 tracing: Centrali... |
113 114 |
} EXPORT_SYMBOL(trace_hardirqs_on_caller); |
eeeb080ba kprobes: Prohibit... |
115 |
NOKPROBE_SYMBOL(trace_hardirqs_on_caller); |
c3bc8fd63 tracing: Centrali... |
116 117 118 |
__visible void trace_hardirqs_off_caller(unsigned long caller_addr) { |
73ac74c7d lockdep: fix orde... |
119 |
lockdep_hardirqs_off(CALLER_ADDR0); |
bff1b208a tracing: Partial ... |
120 121 |
if (!this_cpu_read(tracing_irq_cpu)) { this_cpu_write(tracing_irq_cpu, 1); |
3f1756dc2 tracing: More rev... |
122 |
tracer_hardirqs_off(CALLER_ADDR0, caller_addr); |
2e14f01dc ANDROID: tracing:... |
123 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
124 |
trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr); |
2e14f01dc ANDROID: tracing:... |
125 126 127 |
trace_android_rvh_irqs_enable(CALLER_ADDR0, caller_addr); } |
bff1b208a tracing: Partial ... |
128 |
} |
c3bc8fd63 tracing: Centrali... |
129 130 |
} EXPORT_SYMBOL(trace_hardirqs_off_caller); |
eeeb080ba kprobes: Prohibit... |
131 |
NOKPROBE_SYMBOL(trace_hardirqs_off_caller); |
c3bc8fd63 tracing: Centrali... |
132 133 134 135 136 137 |
#endif /* CONFIG_TRACE_IRQFLAGS */ #ifdef CONFIG_TRACE_PREEMPT_TOGGLE void trace_preempt_on(unsigned long a0, unsigned long a1) { |
2e14f01dc ANDROID: tracing:... |
138 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
139 |
trace_preempt_enable_rcuidle(a0, a1); |
2e14f01dc ANDROID: tracing:... |
140 141 |
trace_android_rvh_preempt_enable(a0, a1); } |
3f1756dc2 tracing: More rev... |
142 |
tracer_preempt_on(a0, a1); |
c3bc8fd63 tracing: Centrali... |
143 144 145 146 |
} void trace_preempt_off(unsigned long a0, unsigned long a1) { |
2e14f01dc ANDROID: tracing:... |
147 |
if (!in_nmi()) { |
3f1756dc2 tracing: More rev... |
148 |
trace_preempt_disable_rcuidle(a0, a1); |
2e14f01dc ANDROID: tracing:... |
149 150 |
trace_android_rvh_preempt_disable(a0, a1); } |
3f1756dc2 tracing: More rev... |
151 |
tracer_preempt_off(a0, a1); |
c3bc8fd63 tracing: Centrali... |
152 153 |
} #endif |