xref: /openbmc/linux/include/trace/events/rcu.h (revision 7cb92499)
129c00b4aSPaul E. McKenney #undef TRACE_SYSTEM
229c00b4aSPaul E. McKenney #define TRACE_SYSTEM rcu
329c00b4aSPaul E. McKenney 
429c00b4aSPaul E. McKenney #if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ)
529c00b4aSPaul E. McKenney #define _TRACE_RCU_H
629c00b4aSPaul E. McKenney 
729c00b4aSPaul E. McKenney #include <linux/tracepoint.h>
829c00b4aSPaul E. McKenney 
929c00b4aSPaul E. McKenney /*
10300df91cSPaul E. McKenney  * Tracepoint for start/end markers used for utilization calculations.
11300df91cSPaul E. McKenney  * By convention, the string is of the following forms:
12300df91cSPaul E. McKenney  *
13300df91cSPaul E. McKenney  * "Start <activity>" -- Mark the start of the specified activity,
14300df91cSPaul E. McKenney  *			 such as "context switch".  Nesting is permitted.
15300df91cSPaul E. McKenney  * "End <activity>" -- Mark the end of the specified activity.
16385680a9SPaul E. McKenney  *
17385680a9SPaul E. McKenney  * An "@" character within "<activity>" is a comment character: Data
18385680a9SPaul E. McKenney  * reduction scripts will ignore the "@" and the remainder of the line.
19300df91cSPaul E. McKenney  */
20300df91cSPaul E. McKenney TRACE_EVENT(rcu_utilization,
21300df91cSPaul E. McKenney 
22300df91cSPaul E. McKenney 	TP_PROTO(char *s),
23300df91cSPaul E. McKenney 
24300df91cSPaul E. McKenney 	TP_ARGS(s),
25300df91cSPaul E. McKenney 
26300df91cSPaul E. McKenney 	TP_STRUCT__entry(
27300df91cSPaul E. McKenney 		__field(char *, s)
28300df91cSPaul E. McKenney 	),
29300df91cSPaul E. McKenney 
30300df91cSPaul E. McKenney 	TP_fast_assign(
31300df91cSPaul E. McKenney 		__entry->s = s;
32300df91cSPaul E. McKenney 	),
33300df91cSPaul E. McKenney 
34300df91cSPaul E. McKenney 	TP_printk("%s", __entry->s)
35300df91cSPaul E. McKenney );
36300df91cSPaul E. McKenney 
37d4c08f2aSPaul E. McKenney #ifdef CONFIG_RCU_TRACE
38d4c08f2aSPaul E. McKenney 
39d4c08f2aSPaul E. McKenney #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)
40d4c08f2aSPaul E. McKenney 
41d4c08f2aSPaul E. McKenney /*
42d4c08f2aSPaul E. McKenney  * Tracepoint for grace-period events: starting and ending a grace
43d4c08f2aSPaul E. McKenney  * period ("start" and "end", respectively), a CPU noting the start
44d4c08f2aSPaul E. McKenney  * of a new grace period or the end of an old grace period ("cpustart"
45d4c08f2aSPaul E. McKenney  * and "cpuend", respectively), a CPU passing through a quiescent
46d4c08f2aSPaul E. McKenney  * state ("cpuqs"), a CPU coming online or going offline ("cpuonl"
47d4c08f2aSPaul E. McKenney  * and "cpuofl", respectively), and a CPU being kicked for being too
48d4c08f2aSPaul E. McKenney  * long in dyntick-idle mode ("kick").
49d4c08f2aSPaul E. McKenney  */
50d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_grace_period,
51d4c08f2aSPaul E. McKenney 
52d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, unsigned long gpnum, char *gpevent),
53d4c08f2aSPaul E. McKenney 
54d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, gpnum, gpevent),
55d4c08f2aSPaul E. McKenney 
56d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
57d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
58d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
59d4c08f2aSPaul E. McKenney 		__field(char *, gpevent)
60d4c08f2aSPaul E. McKenney 	),
61d4c08f2aSPaul E. McKenney 
62d4c08f2aSPaul E. McKenney 	TP_fast_assign(
63d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
64d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
65d4c08f2aSPaul E. McKenney 		__entry->gpevent = gpevent;
66d4c08f2aSPaul E. McKenney 	),
67d4c08f2aSPaul E. McKenney 
68d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %s",
69d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->gpnum, __entry->gpevent)
70d4c08f2aSPaul E. McKenney );
71d4c08f2aSPaul E. McKenney 
72d4c08f2aSPaul E. McKenney /*
73d4c08f2aSPaul E. McKenney  * Tracepoint for grace-period-initialization events.  These are
74d4c08f2aSPaul E. McKenney  * distinguished by the type of RCU, the new grace-period number, the
75d4c08f2aSPaul E. McKenney  * rcu_node structure level, the starting and ending CPU covered by the
76d4c08f2aSPaul E. McKenney  * rcu_node structure, and the mask of CPUs that will be waited for.
77d4c08f2aSPaul E. McKenney  * All but the type of RCU are extracted from the rcu_node structure.
78d4c08f2aSPaul E. McKenney  */
79d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_grace_period_init,
80d4c08f2aSPaul E. McKenney 
81d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, unsigned long gpnum, u8 level,
82d4c08f2aSPaul E. McKenney 		 int grplo, int grphi, unsigned long qsmask),
83d4c08f2aSPaul E. McKenney 
84d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, gpnum, level, grplo, grphi, qsmask),
85d4c08f2aSPaul E. McKenney 
86d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
87d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
88d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
89d4c08f2aSPaul E. McKenney 		__field(u8, level)
90d4c08f2aSPaul E. McKenney 		__field(int, grplo)
91d4c08f2aSPaul E. McKenney 		__field(int, grphi)
92d4c08f2aSPaul E. McKenney 		__field(unsigned long, qsmask)
93d4c08f2aSPaul E. McKenney 	),
94d4c08f2aSPaul E. McKenney 
95d4c08f2aSPaul E. McKenney 	TP_fast_assign(
96d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
97d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
98d4c08f2aSPaul E. McKenney 		__entry->level = level;
99d4c08f2aSPaul E. McKenney 		__entry->grplo = grplo;
100d4c08f2aSPaul E. McKenney 		__entry->grphi = grphi;
101d4c08f2aSPaul E. McKenney 		__entry->qsmask = qsmask;
102d4c08f2aSPaul E. McKenney 	),
103d4c08f2aSPaul E. McKenney 
104d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %u %d %d %lx",
105d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->gpnum, __entry->level,
106d4c08f2aSPaul E. McKenney 		  __entry->grplo, __entry->grphi, __entry->qsmask)
107d4c08f2aSPaul E. McKenney );
108d4c08f2aSPaul E. McKenney 
109d4c08f2aSPaul E. McKenney /*
110d4c08f2aSPaul E. McKenney  * Tracepoint for tasks blocking within preemptible-RCU read-side
111d4c08f2aSPaul E. McKenney  * critical sections.  Track the type of RCU (which one day might
112d4c08f2aSPaul E. McKenney  * include SRCU), the grace-period number that the task is blocking
113d4c08f2aSPaul E. McKenney  * (the current or the next), and the task's PID.
114d4c08f2aSPaul E. McKenney  */
115d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_preempt_task,
116d4c08f2aSPaul E. McKenney 
117d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, int pid, unsigned long gpnum),
118d4c08f2aSPaul E. McKenney 
119d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, pid, gpnum),
120d4c08f2aSPaul E. McKenney 
121d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
122d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
123d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
124d4c08f2aSPaul E. McKenney 		__field(int, pid)
125d4c08f2aSPaul E. McKenney 	),
126d4c08f2aSPaul E. McKenney 
127d4c08f2aSPaul E. McKenney 	TP_fast_assign(
128d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
129d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
130d4c08f2aSPaul E. McKenney 		__entry->pid = pid;
131d4c08f2aSPaul E. McKenney 	),
132d4c08f2aSPaul E. McKenney 
133d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %d",
134d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->gpnum, __entry->pid)
135d4c08f2aSPaul E. McKenney );
136d4c08f2aSPaul E. McKenney 
137d4c08f2aSPaul E. McKenney /*
138d4c08f2aSPaul E. McKenney  * Tracepoint for tasks that blocked within a given preemptible-RCU
139d4c08f2aSPaul E. McKenney  * read-side critical section exiting that critical section.  Track the
140d4c08f2aSPaul E. McKenney  * type of RCU (which one day might include SRCU) and the task's PID.
141d4c08f2aSPaul E. McKenney  */
142d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_unlock_preempted_task,
143d4c08f2aSPaul E. McKenney 
144d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, unsigned long gpnum, int pid),
145d4c08f2aSPaul E. McKenney 
146d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, gpnum, pid),
147d4c08f2aSPaul E. McKenney 
148d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
149d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
150d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
151d4c08f2aSPaul E. McKenney 		__field(int, pid)
152d4c08f2aSPaul E. McKenney 	),
153d4c08f2aSPaul E. McKenney 
154d4c08f2aSPaul E. McKenney 	TP_fast_assign(
155d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
156d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
157d4c08f2aSPaul E. McKenney 		__entry->pid = pid;
158d4c08f2aSPaul E. McKenney 	),
159d4c08f2aSPaul E. McKenney 
160d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %d", __entry->rcuname, __entry->gpnum, __entry->pid)
161d4c08f2aSPaul E. McKenney );
162d4c08f2aSPaul E. McKenney 
163d4c08f2aSPaul E. McKenney /*
164d4c08f2aSPaul E. McKenney  * Tracepoint for quiescent-state-reporting events.  These are
165d4c08f2aSPaul E. McKenney  * distinguished by the type of RCU, the grace-period number, the
166d4c08f2aSPaul E. McKenney  * mask of quiescent lower-level entities, the rcu_node structure level,
167d4c08f2aSPaul E. McKenney  * the starting and ending CPU covered by the rcu_node structure, and
168d4c08f2aSPaul E. McKenney  * whether there are any blocked tasks blocking the current grace period.
169d4c08f2aSPaul E. McKenney  * All but the type of RCU are extracted from the rcu_node structure.
170d4c08f2aSPaul E. McKenney  */
171d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_quiescent_state_report,
172d4c08f2aSPaul E. McKenney 
173d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, unsigned long gpnum,
174d4c08f2aSPaul E. McKenney 		 unsigned long mask, unsigned long qsmask,
175d4c08f2aSPaul E. McKenney 		 u8 level, int grplo, int grphi, int gp_tasks),
176d4c08f2aSPaul E. McKenney 
177d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks),
178d4c08f2aSPaul E. McKenney 
179d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
180d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
181d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
182d4c08f2aSPaul E. McKenney 		__field(unsigned long, mask)
183d4c08f2aSPaul E. McKenney 		__field(unsigned long, qsmask)
184d4c08f2aSPaul E. McKenney 		__field(u8, level)
185d4c08f2aSPaul E. McKenney 		__field(int, grplo)
186d4c08f2aSPaul E. McKenney 		__field(int, grphi)
187d4c08f2aSPaul E. McKenney 		__field(u8, gp_tasks)
188d4c08f2aSPaul E. McKenney 	),
189d4c08f2aSPaul E. McKenney 
190d4c08f2aSPaul E. McKenney 	TP_fast_assign(
191d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
192d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
193d4c08f2aSPaul E. McKenney 		__entry->mask = mask;
194d4c08f2aSPaul E. McKenney 		__entry->qsmask = qsmask;
195d4c08f2aSPaul E. McKenney 		__entry->level = level;
196d4c08f2aSPaul E. McKenney 		__entry->grplo = grplo;
197d4c08f2aSPaul E. McKenney 		__entry->grphi = grphi;
198d4c08f2aSPaul E. McKenney 		__entry->gp_tasks = gp_tasks;
199d4c08f2aSPaul E. McKenney 	),
200d4c08f2aSPaul E. McKenney 
201d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %lx>%lx %u %d %d %u",
202d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->gpnum,
203d4c08f2aSPaul E. McKenney 		  __entry->mask, __entry->qsmask, __entry->level,
204d4c08f2aSPaul E. McKenney 		  __entry->grplo, __entry->grphi, __entry->gp_tasks)
205d4c08f2aSPaul E. McKenney );
206d4c08f2aSPaul E. McKenney 
207d4c08f2aSPaul E. McKenney /*
208d4c08f2aSPaul E. McKenney  * Tracepoint for quiescent states detected by force_quiescent_state().
209d4c08f2aSPaul E. McKenney  * These trace events include the type of RCU, the grace-period number
210d4c08f2aSPaul E. McKenney  * that was blocked by the CPU, the CPU itself, and the type of quiescent
211d4c08f2aSPaul E. McKenney  * state, which can be "dti" for dyntick-idle mode, "ofl" for CPU offline,
212d4c08f2aSPaul E. McKenney  * or "kick" when kicking a CPU that has been in dyntick-idle mode for
213d4c08f2aSPaul E. McKenney  * too long.
214d4c08f2aSPaul E. McKenney  */
215d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_fqs,
216d4c08f2aSPaul E. McKenney 
217d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, unsigned long gpnum, int cpu, char *qsevent),
218d4c08f2aSPaul E. McKenney 
219d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, gpnum, cpu, qsevent),
220d4c08f2aSPaul E. McKenney 
221d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
222d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
223d4c08f2aSPaul E. McKenney 		__field(unsigned long, gpnum)
224d4c08f2aSPaul E. McKenney 		__field(int, cpu)
225d4c08f2aSPaul E. McKenney 		__field(char *, qsevent)
226d4c08f2aSPaul E. McKenney 	),
227d4c08f2aSPaul E. McKenney 
228d4c08f2aSPaul E. McKenney 	TP_fast_assign(
229d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
230d4c08f2aSPaul E. McKenney 		__entry->gpnum = gpnum;
231d4c08f2aSPaul E. McKenney 		__entry->cpu = cpu;
232d4c08f2aSPaul E. McKenney 		__entry->qsevent = qsevent;
233d4c08f2aSPaul E. McKenney 	),
234d4c08f2aSPaul E. McKenney 
235d4c08f2aSPaul E. McKenney 	TP_printk("%s %lu %d %s",
236d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->gpnum,
237d4c08f2aSPaul E. McKenney 		  __entry->cpu, __entry->qsevent)
238d4c08f2aSPaul E. McKenney );
239d4c08f2aSPaul E. McKenney 
240d4c08f2aSPaul E. McKenney #endif /* #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) */
241d4c08f2aSPaul E. McKenney 
242d4c08f2aSPaul E. McKenney /*
243d4c08f2aSPaul E. McKenney  * Tracepoint for dyntick-idle entry/exit events.  These take a string
244045fb931SPaul E. McKenney  * as argument: "Start" for entering dyntick-idle mode, "End" for
245045fb931SPaul E. McKenney  * leaving it, "--=" for events moving towards idle, and "++=" for events
246045fb931SPaul E. McKenney  * moving away from idle.  "Error on entry: not idle task" and "Error on
247045fb931SPaul E. McKenney  * exit: not idle task" indicate that a non-idle task is erroneously
248045fb931SPaul E. McKenney  * toying with the idle loop.
249045fb931SPaul E. McKenney  *
250045fb931SPaul E. McKenney  * These events also take a pair of numbers, which indicate the nesting
251045fb931SPaul E. McKenney  * depth before and after the event of interest.  Note that task-related
252045fb931SPaul E. McKenney  * events use the upper bits of each number, while interrupt-related
253045fb931SPaul E. McKenney  * events use the lower bits.
254d4c08f2aSPaul E. McKenney  */
255d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_dyntick,
256d4c08f2aSPaul E. McKenney 
2574145fa7fSPaul E. McKenney 	TP_PROTO(char *polarity, long long oldnesting, long long newnesting),
258d4c08f2aSPaul E. McKenney 
2594145fa7fSPaul E. McKenney 	TP_ARGS(polarity, oldnesting, newnesting),
260d4c08f2aSPaul E. McKenney 
261d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
262d4c08f2aSPaul E. McKenney 		__field(char *, polarity)
2634145fa7fSPaul E. McKenney 		__field(long long, oldnesting)
2644145fa7fSPaul E. McKenney 		__field(long long, newnesting)
265d4c08f2aSPaul E. McKenney 	),
266d4c08f2aSPaul E. McKenney 
267d4c08f2aSPaul E. McKenney 	TP_fast_assign(
268d4c08f2aSPaul E. McKenney 		__entry->polarity = polarity;
2694145fa7fSPaul E. McKenney 		__entry->oldnesting = oldnesting;
2704145fa7fSPaul E. McKenney 		__entry->newnesting = newnesting;
271d4c08f2aSPaul E. McKenney 	),
272d4c08f2aSPaul E. McKenney 
2734145fa7fSPaul E. McKenney 	TP_printk("%s %llx %llx", __entry->polarity,
2744145fa7fSPaul E. McKenney 		  __entry->oldnesting, __entry->newnesting)
275d4c08f2aSPaul E. McKenney );
276d4c08f2aSPaul E. McKenney 
277d4c08f2aSPaul E. McKenney /*
278433cdddcSPaul E. McKenney  * Tracepoint for RCU preparation for idle, the goal being to get RCU
279433cdddcSPaul E. McKenney  * processing done so that the current CPU can shut off its scheduling
280433cdddcSPaul E. McKenney  * clock and enter dyntick-idle mode.  One way to accomplish this is
281433cdddcSPaul E. McKenney  * to drain all RCU callbacks from this CPU, and the other is to have
282433cdddcSPaul E. McKenney  * done everything RCU requires for the current grace period.  In this
283433cdddcSPaul E. McKenney  * latter case, the CPU will be awakened at the end of the current grace
284433cdddcSPaul E. McKenney  * period in order to process the remainder of its callbacks.
285433cdddcSPaul E. McKenney  *
286433cdddcSPaul E. McKenney  * These tracepoints take a string as argument:
287433cdddcSPaul E. McKenney  *
288433cdddcSPaul E. McKenney  *	"No callbacks": Nothing to do, no callbacks on this CPU.
289433cdddcSPaul E. McKenney  *	"In holdoff": Nothing to do, holding off after unsuccessful attempt.
290433cdddcSPaul E. McKenney  *	"Begin holdoff": Attempt failed, don't retry until next jiffy.
2917cb92499SPaul E. McKenney  *	"Dyntick with callbacks": Entering dyntick-idle despite callbacks.
292433cdddcSPaul E. McKenney  *	"More callbacks": Still more callbacks, try again to clear them out.
293433cdddcSPaul E. McKenney  *	"Callbacks drained": All callbacks processed, off to dyntick idle!
2947cb92499SPaul E. McKenney  *	"Timer": Timer fired to cause CPU to continue processing callbacks.
295433cdddcSPaul E. McKenney  */
296433cdddcSPaul E. McKenney TRACE_EVENT(rcu_prep_idle,
297433cdddcSPaul E. McKenney 
298433cdddcSPaul E. McKenney 	TP_PROTO(char *reason),
299433cdddcSPaul E. McKenney 
300433cdddcSPaul E. McKenney 	TP_ARGS(reason),
301433cdddcSPaul E. McKenney 
302433cdddcSPaul E. McKenney 	TP_STRUCT__entry(
303433cdddcSPaul E. McKenney 		__field(char *, reason)
304433cdddcSPaul E. McKenney 	),
305433cdddcSPaul E. McKenney 
306433cdddcSPaul E. McKenney 	TP_fast_assign(
307433cdddcSPaul E. McKenney 		__entry->reason = reason;
308433cdddcSPaul E. McKenney 	),
309433cdddcSPaul E. McKenney 
310433cdddcSPaul E. McKenney 	TP_printk("%s", __entry->reason)
311433cdddcSPaul E. McKenney );
312433cdddcSPaul E. McKenney 
313433cdddcSPaul E. McKenney /*
314d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback function.
315d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, the second argument is
316d4c08f2aSPaul E. McKenney  * a pointer to the RCU callback itself, and the third element is the
317d4c08f2aSPaul E. McKenney  * new RCU callback queue length for the current CPU.
318d4c08f2aSPaul E. McKenney  */
319d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_callback,
320d4c08f2aSPaul E. McKenney 
321d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, long qlen),
322d4c08f2aSPaul E. McKenney 
323d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp, qlen),
324d4c08f2aSPaul E. McKenney 
325d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
326d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
327d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
328d4c08f2aSPaul E. McKenney 		__field(void *, func)
329d4c08f2aSPaul E. McKenney 		__field(long, qlen)
330d4c08f2aSPaul E. McKenney 	),
331d4c08f2aSPaul E. McKenney 
332d4c08f2aSPaul E. McKenney 	TP_fast_assign(
333d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
334d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
335d4c08f2aSPaul E. McKenney 		__entry->func = rhp->func;
336d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
337d4c08f2aSPaul E. McKenney 	),
338d4c08f2aSPaul E. McKenney 
339d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf %ld",
340d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func, __entry->qlen)
341d4c08f2aSPaul E. McKenney );
342d4c08f2aSPaul E. McKenney 
343d4c08f2aSPaul E. McKenney /*
344d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback of the special
345d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU type, the second argument
346d4c08f2aSPaul E. McKenney  * is a pointer to the RCU callback, the third argument is the offset
347d4c08f2aSPaul E. McKenney  * of the callback within the enclosing RCU-protected data structure,
348d4c08f2aSPaul E. McKenney  * and the fourth argument is the new RCU callback queue length for the
349d4c08f2aSPaul E. McKenney  * current CPU.
350d4c08f2aSPaul E. McKenney  */
351d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_kfree_callback,
352d4c08f2aSPaul E. McKenney 
353d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset,
354d4c08f2aSPaul E. McKenney 		 long qlen),
355d4c08f2aSPaul E. McKenney 
356d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset, qlen),
357d4c08f2aSPaul E. McKenney 
358d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
359d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
360d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
361d4c08f2aSPaul E. McKenney 		__field(unsigned long, offset)
362d4c08f2aSPaul E. McKenney 		__field(long, qlen)
363d4c08f2aSPaul E. McKenney 	),
364d4c08f2aSPaul E. McKenney 
365d4c08f2aSPaul E. McKenney 	TP_fast_assign(
366d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
367d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
368d4c08f2aSPaul E. McKenney 		__entry->offset = offset;
369d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
370d4c08f2aSPaul E. McKenney 	),
371d4c08f2aSPaul E. McKenney 
372d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld %ld",
373d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset,
374d4c08f2aSPaul E. McKenney 		  __entry->qlen)
375d4c08f2aSPaul E. McKenney );
376d4c08f2aSPaul E. McKenney 
377300df91cSPaul E. McKenney /*
378300df91cSPaul E. McKenney  * Tracepoint for marking the beginning rcu_do_batch, performed to start
37972fe701bSPaul E. McKenney  * RCU callback invocation.  The first argument is the RCU flavor,
38072fe701bSPaul E. McKenney  * the second is the total number of callbacks (including those that
38172fe701bSPaul E. McKenney  * are not yet ready to be invoked), and the third argument is the
38272fe701bSPaul E. McKenney  * current RCU-callback batch limit.
38329c00b4aSPaul E. McKenney  */
38429c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_start,
38529c00b4aSPaul E. McKenney 
38672fe701bSPaul E. McKenney 	TP_PROTO(char *rcuname, long qlen, int blimit),
38729c00b4aSPaul E. McKenney 
38872fe701bSPaul E. McKenney 	TP_ARGS(rcuname, qlen, blimit),
38929c00b4aSPaul E. McKenney 
39029c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
39172fe701bSPaul E. McKenney 		__field(char *, rcuname)
392300df91cSPaul E. McKenney 		__field(long, qlen)
39329c00b4aSPaul E. McKenney 		__field(int, blimit)
39429c00b4aSPaul E. McKenney 	),
39529c00b4aSPaul E. McKenney 
39629c00b4aSPaul E. McKenney 	TP_fast_assign(
39772fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
398300df91cSPaul E. McKenney 		__entry->qlen = qlen;
39929c00b4aSPaul E. McKenney 		__entry->blimit = blimit;
40029c00b4aSPaul E. McKenney 	),
40129c00b4aSPaul E. McKenney 
40272fe701bSPaul E. McKenney 	TP_printk("%s CBs=%ld bl=%d",
40372fe701bSPaul E. McKenney 		  __entry->rcuname, __entry->qlen, __entry->blimit)
40429c00b4aSPaul E. McKenney );
40529c00b4aSPaul E. McKenney 
40629c00b4aSPaul E. McKenney /*
407300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback function.
408d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, and the second argument is
409d4c08f2aSPaul E. McKenney  * a pointer to the RCU callback itself.
41029c00b4aSPaul E. McKenney  */
41129c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_callback,
41229c00b4aSPaul E. McKenney 
413d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp),
41429c00b4aSPaul E. McKenney 
415d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp),
41629c00b4aSPaul E. McKenney 
41729c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
418d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
41929c00b4aSPaul E. McKenney 		__field(void *, rhp)
42029c00b4aSPaul E. McKenney 		__field(void *, func)
42129c00b4aSPaul E. McKenney 	),
42229c00b4aSPaul E. McKenney 
42329c00b4aSPaul E. McKenney 	TP_fast_assign(
424d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
42529c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
42629c00b4aSPaul E. McKenney 		__entry->func = rhp->func;
42729c00b4aSPaul E. McKenney 	),
42829c00b4aSPaul E. McKenney 
429d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf",
430d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func)
43129c00b4aSPaul E. McKenney );
43229c00b4aSPaul E. McKenney 
43329c00b4aSPaul E. McKenney /*
434300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback of the special
435d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU flavor, the second
436d4c08f2aSPaul E. McKenney  * argument is a pointer to the RCU callback, and the third argument
437d4c08f2aSPaul E. McKenney  * is the offset of the callback within the enclosing RCU-protected
438d4c08f2aSPaul E. McKenney  * data structure.
43929c00b4aSPaul E. McKenney  */
44029c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_kfree_callback,
44129c00b4aSPaul E. McKenney 
442d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset),
44329c00b4aSPaul E. McKenney 
444d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset),
44529c00b4aSPaul E. McKenney 
44629c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
447d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
44829c00b4aSPaul E. McKenney 		__field(void *, rhp)
44929c00b4aSPaul E. McKenney 		__field(unsigned long, offset)
45029c00b4aSPaul E. McKenney 	),
45129c00b4aSPaul E. McKenney 
45229c00b4aSPaul E. McKenney 	TP_fast_assign(
453d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
45429c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
45529c00b4aSPaul E. McKenney 		__entry->offset	= offset;
45629c00b4aSPaul E. McKenney 	),
45729c00b4aSPaul E. McKenney 
458d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld",
459d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset)
46029c00b4aSPaul E. McKenney );
46129c00b4aSPaul E. McKenney 
46229c00b4aSPaul E. McKenney /*
463300df91cSPaul E. McKenney  * Tracepoint for exiting rcu_do_batch after RCU callbacks have been
46472fe701bSPaul E. McKenney  * invoked.  The first argument is the name of the RCU flavor and
46572fe701bSPaul E. McKenney  * the second argument is number of callbacks actually invoked.
46629c00b4aSPaul E. McKenney  */
46729c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_end,
46829c00b4aSPaul E. McKenney 
46972fe701bSPaul E. McKenney 	TP_PROTO(char *rcuname, int callbacks_invoked),
47029c00b4aSPaul E. McKenney 
47172fe701bSPaul E. McKenney 	TP_ARGS(rcuname, callbacks_invoked),
47229c00b4aSPaul E. McKenney 
47329c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
47472fe701bSPaul E. McKenney 		__field(char *, rcuname)
47529c00b4aSPaul E. McKenney 		__field(int, callbacks_invoked)
47629c00b4aSPaul E. McKenney 	),
47729c00b4aSPaul E. McKenney 
47829c00b4aSPaul E. McKenney 	TP_fast_assign(
47972fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
48029c00b4aSPaul E. McKenney 		__entry->callbacks_invoked = callbacks_invoked;
48129c00b4aSPaul E. McKenney 	),
48229c00b4aSPaul E. McKenney 
48372fe701bSPaul E. McKenney 	TP_printk("%s CBs-invoked=%d",
48472fe701bSPaul E. McKenney 		  __entry->rcuname, __entry->callbacks_invoked)
48529c00b4aSPaul E. McKenney );
48629c00b4aSPaul E. McKenney 
48791afaf30SPaul E. McKenney /*
48891afaf30SPaul E. McKenney  * Tracepoint for rcutorture readers.  The first argument is the name
48991afaf30SPaul E. McKenney  * of the RCU flavor from rcutorture's viewpoint and the second argument
49091afaf30SPaul E. McKenney  * is the callback address.
49191afaf30SPaul E. McKenney  */
49291afaf30SPaul E. McKenney TRACE_EVENT(rcu_torture_read,
49391afaf30SPaul E. McKenney 
49491afaf30SPaul E. McKenney 	TP_PROTO(char *rcutorturename, struct rcu_head *rhp),
49591afaf30SPaul E. McKenney 
49691afaf30SPaul E. McKenney 	TP_ARGS(rcutorturename, rhp),
49791afaf30SPaul E. McKenney 
49891afaf30SPaul E. McKenney 	TP_STRUCT__entry(
49991afaf30SPaul E. McKenney 		__field(char *, rcutorturename)
50091afaf30SPaul E. McKenney 		__field(struct rcu_head *, rhp)
50191afaf30SPaul E. McKenney 	),
50291afaf30SPaul E. McKenney 
50391afaf30SPaul E. McKenney 	TP_fast_assign(
50491afaf30SPaul E. McKenney 		__entry->rcutorturename = rcutorturename;
50591afaf30SPaul E. McKenney 		__entry->rhp = rhp;
50691afaf30SPaul E. McKenney 	),
50791afaf30SPaul E. McKenney 
50891afaf30SPaul E. McKenney 	TP_printk("%s torture read %p",
50991afaf30SPaul E. McKenney 		  __entry->rcutorturename, __entry->rhp)
51091afaf30SPaul E. McKenney );
51191afaf30SPaul E. McKenney 
512d4c08f2aSPaul E. McKenney #else /* #ifdef CONFIG_RCU_TRACE */
513d4c08f2aSPaul E. McKenney 
514d4c08f2aSPaul E. McKenney #define trace_rcu_grace_period(rcuname, gpnum, gpevent) do { } while (0)
515d4c08f2aSPaul E. McKenney #define trace_rcu_grace_period_init(rcuname, gpnum, level, grplo, grphi, qsmask) do { } while (0)
516d4c08f2aSPaul E. McKenney #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)
517d4c08f2aSPaul E. McKenney #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)
518d4c08f2aSPaul E. McKenney #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks) do { } while (0)
519d4c08f2aSPaul E. McKenney #define trace_rcu_fqs(rcuname, gpnum, cpu, qsevent) do { } while (0)
5204145fa7fSPaul E. McKenney #define trace_rcu_dyntick(polarity, oldnesting, newnesting) do { } while (0)
521433cdddcSPaul E. McKenney #define trace_rcu_prep_idle(reason) do { } while (0)
522d4c08f2aSPaul E. McKenney #define trace_rcu_callback(rcuname, rhp, qlen) do { } while (0)
523d4c08f2aSPaul E. McKenney #define trace_rcu_kfree_callback(rcuname, rhp, offset, qlen) do { } while (0)
524d4c08f2aSPaul E. McKenney #define trace_rcu_batch_start(rcuname, qlen, blimit) do { } while (0)
525d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_callback(rcuname, rhp) do { } while (0)
526d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_kfree_callback(rcuname, rhp, offset) do { } while (0)
527d4c08f2aSPaul E. McKenney #define trace_rcu_batch_end(rcuname, callbacks_invoked) do { } while (0)
52891afaf30SPaul E. McKenney #define trace_rcu_torture_read(rcutorturename, rhp) do { } while (0)
529d4c08f2aSPaul E. McKenney 
530d4c08f2aSPaul E. McKenney #endif /* #else #ifdef CONFIG_RCU_TRACE */
531d4c08f2aSPaul E. McKenney 
53229c00b4aSPaul E. McKenney #endif /* _TRACE_RCU_H */
53329c00b4aSPaul E. McKenney 
53429c00b4aSPaul E. McKenney /* This part must be outside protection */
53529c00b4aSPaul E. McKenney #include <trace/define_trace.h>
536