Blame view

kernel/trace/trace_preemptirq.c 4.22 KB
c3bc8fd63   Joel Fernandes (Google)   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   Masami Hiramatsu   kprobes: Prohibit...
12
  #include <linux/kprobes.h>
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
13
  #include "trace.h"
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
14
15
16
  
  #define CREATE_TRACE_POINTS
  #include <trace/events/preemptirq.h>
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
17
18
  #undef CREATE_TRACE_POINTS
  #include <trace/hooks/preemptirq.h>
c3bc8fd63   Joel Fernandes (Google)   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   Thomas Gleixner   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   Pavankumar Kondeti   ANDROID: tracing:...
32
  		if (!in_nmi()) {
0995a5dfb   Thomas Gleixner   tracing: Provide ...
33
  			trace_irq_enable(CALLER_ADDR0, CALLER_ADDR1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
34
35
36
  			trace_android_rvh_irqs_enable(CALLER_ADDR0,
  						      CALLER_ADDR1);
  		}
0995a5dfb   Thomas Gleixner   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   Joel Fernandes (Google)   tracing: Centrali...
43
44
  void trace_hardirqs_on(void)
  {
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
45
  	if (this_cpu_read(tracing_irq_cpu)) {
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
46
  		if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
47
  			trace_irq_enable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
48
49
50
  			trace_android_rvh_irqs_enable(CALLER_ADDR0,
  						      CALLER_ADDR1);
  		}
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
51
  		tracer_hardirqs_on(CALLER_ADDR0, CALLER_ADDR1);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
52
53
  		this_cpu_write(tracing_irq_cpu, 0);
  	}
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
54

c86e9b987   Peter Zijlstra   lockdep: Prepare ...
55
  	lockdep_hardirqs_on_prepare(CALLER_ADDR0);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
56
  	lockdep_hardirqs_on(CALLER_ADDR0);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
57
58
  }
  EXPORT_SYMBOL(trace_hardirqs_on);
eeeb080ba   Masami Hiramatsu   kprobes: Prohibit...
59
  NOKPROBE_SYMBOL(trace_hardirqs_on);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
60

0995a5dfb   Thomas Gleixner   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   Peter Zijlstra   x86/entry: Rename...
67
  void trace_hardirqs_off_finish(void)
0995a5dfb   Thomas Gleixner   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   Pavankumar Kondeti   ANDROID: tracing:...
72
  		if (!in_nmi()) {
0995a5dfb   Thomas Gleixner   tracing: Provide ...
73
  			trace_irq_disable(CALLER_ADDR0, CALLER_ADDR1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
74
75
76
  			trace_android_rvh_irqs_disable(CALLER_ADDR0,
  						       CALLER_ADDR1);
  		}
0995a5dfb   Thomas Gleixner   tracing: Provide ...
77
78
79
  	}
  
  }
bf2b30084   Peter Zijlstra   x86/entry: Rename...
80
81
  EXPORT_SYMBOL(trace_hardirqs_off_finish);
  NOKPROBE_SYMBOL(trace_hardirqs_off_finish);
0995a5dfb   Thomas Gleixner   tracing: Provide ...
82

c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
83
84
  void trace_hardirqs_off(void)
  {
bf2b30084   Peter Zijlstra   x86/entry: Rename...
85
  	lockdep_hardirqs_off(CALLER_ADDR0);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
86
87
  	if (!this_cpu_read(tracing_irq_cpu)) {
  		this_cpu_write(tracing_irq_cpu, 1);
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
88
  		tracer_hardirqs_off(CALLER_ADDR0, CALLER_ADDR1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
89
  		if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
90
  			trace_irq_disable_rcuidle(CALLER_ADDR0, CALLER_ADDR1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
91
92
93
  			trace_android_rvh_irqs_disable(CALLER_ADDR0,
  						       CALLER_ADDR1);
  		}
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
94
  	}
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
95
96
  }
  EXPORT_SYMBOL(trace_hardirqs_off);
eeeb080ba   Masami Hiramatsu   kprobes: Prohibit...
97
  NOKPROBE_SYMBOL(trace_hardirqs_off);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
98
99
100
  
  __visible void trace_hardirqs_on_caller(unsigned long caller_addr)
  {
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
101
  	if (this_cpu_read(tracing_irq_cpu)) {
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
102
  		if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
103
  			trace_irq_enable_rcuidle(CALLER_ADDR0, caller_addr);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
104
105
106
  			trace_android_rvh_irqs_enable(CALLER_ADDR0,
  						      caller_addr);
  		}
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
107
  		tracer_hardirqs_on(CALLER_ADDR0, caller_addr);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
108
109
  		this_cpu_write(tracing_irq_cpu, 0);
  	}
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
110

c86e9b987   Peter Zijlstra   lockdep: Prepare ...
111
  	lockdep_hardirqs_on_prepare(CALLER_ADDR0);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
112
  	lockdep_hardirqs_on(CALLER_ADDR0);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
113
114
  }
  EXPORT_SYMBOL(trace_hardirqs_on_caller);
eeeb080ba   Masami Hiramatsu   kprobes: Prohibit...
115
  NOKPROBE_SYMBOL(trace_hardirqs_on_caller);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
116
117
118
  
  __visible void trace_hardirqs_off_caller(unsigned long caller_addr)
  {
73ac74c7d   Sven Schnelle   lockdep: fix orde...
119
  	lockdep_hardirqs_off(CALLER_ADDR0);
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
120
121
  	if (!this_cpu_read(tracing_irq_cpu)) {
  		this_cpu_write(tracing_irq_cpu, 1);
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
122
  		tracer_hardirqs_off(CALLER_ADDR0, caller_addr);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
123
  		if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
124
  			trace_irq_disable_rcuidle(CALLER_ADDR0, caller_addr);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
125
126
127
  			trace_android_rvh_irqs_enable(CALLER_ADDR0,
  						      caller_addr);
  		}
bff1b208a   Steven Rostedt (VMware)   tracing: Partial ...
128
  	}
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
129
130
  }
  EXPORT_SYMBOL(trace_hardirqs_off_caller);
eeeb080ba   Masami Hiramatsu   kprobes: Prohibit...
131
  NOKPROBE_SYMBOL(trace_hardirqs_off_caller);
c3bc8fd63   Joel Fernandes (Google)   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   Pavankumar Kondeti   ANDROID: tracing:...
138
  	if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
139
  		trace_preempt_enable_rcuidle(a0, a1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
140
141
  		trace_android_rvh_preempt_enable(a0, a1);
  	}
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
142
  	tracer_preempt_on(a0, a1);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
143
144
145
146
  }
  
  void trace_preempt_off(unsigned long a0, unsigned long a1)
  {
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
147
  	if (!in_nmi()) {
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
148
  		trace_preempt_disable_rcuidle(a0, a1);
2e14f01dc   Pavankumar Kondeti   ANDROID: tracing:...
149
150
  		trace_android_rvh_preempt_disable(a0, a1);
  	}
3f1756dc2   Steven Rostedt (VMware)   tracing: More rev...
151
  	tracer_preempt_off(a0, a1);
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
152
153
  }
  #endif