xref: /openbmc/linux/include/trace/events/rcu.h (revision 2fdbb31b)
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.
2952fdbb31bSPaul E. McKenney  *	"Cleanup after idle": Idle exited, timer canceled.
296433cdddcSPaul E. McKenney  */
297433cdddcSPaul E. McKenney TRACE_EVENT(rcu_prep_idle,
298433cdddcSPaul E. McKenney 
299433cdddcSPaul E. McKenney 	TP_PROTO(char *reason),
300433cdddcSPaul E. McKenney 
301433cdddcSPaul E. McKenney 	TP_ARGS(reason),
302433cdddcSPaul E. McKenney 
303433cdddcSPaul E. McKenney 	TP_STRUCT__entry(
304433cdddcSPaul E. McKenney 		__field(char *, reason)
305433cdddcSPaul E. McKenney 	),
306433cdddcSPaul E. McKenney 
307433cdddcSPaul E. McKenney 	TP_fast_assign(
308433cdddcSPaul E. McKenney 		__entry->reason = reason;
309433cdddcSPaul E. McKenney 	),
310433cdddcSPaul E. McKenney 
311433cdddcSPaul E. McKenney 	TP_printk("%s", __entry->reason)
312433cdddcSPaul E. McKenney );
313433cdddcSPaul E. McKenney 
314433cdddcSPaul E. McKenney /*
315d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback function.
316d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, the second argument is
317486e2593SPaul E. McKenney  * a pointer to the RCU callback itself, the third element is the
318486e2593SPaul E. McKenney  * number of lazy callbacks queued, and the fourth element is the
319486e2593SPaul E. McKenney  * total number of callbacks queued.
320d4c08f2aSPaul E. McKenney  */
321d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_callback,
322d4c08f2aSPaul E. McKenney 
323486e2593SPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, long qlen_lazy,
324486e2593SPaul E. McKenney 		 long qlen),
325d4c08f2aSPaul E. McKenney 
326486e2593SPaul E. McKenney 	TP_ARGS(rcuname, rhp, qlen_lazy, qlen),
327d4c08f2aSPaul E. McKenney 
328d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
329d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
330d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
331d4c08f2aSPaul E. McKenney 		__field(void *, func)
332486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
333d4c08f2aSPaul E. McKenney 		__field(long, qlen)
334d4c08f2aSPaul E. McKenney 	),
335d4c08f2aSPaul E. McKenney 
336d4c08f2aSPaul E. McKenney 	TP_fast_assign(
337d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
338d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
339d4c08f2aSPaul E. McKenney 		__entry->func = rhp->func;
340486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
341d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
342d4c08f2aSPaul E. McKenney 	),
343d4c08f2aSPaul E. McKenney 
344486e2593SPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf %ld/%ld",
345486e2593SPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func,
346486e2593SPaul E. McKenney 		  __entry->qlen_lazy, __entry->qlen)
347d4c08f2aSPaul E. McKenney );
348d4c08f2aSPaul E. McKenney 
349d4c08f2aSPaul E. McKenney /*
350d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback of the special
351d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU type, the second argument
352d4c08f2aSPaul E. McKenney  * is a pointer to the RCU callback, the third argument is the offset
353d4c08f2aSPaul E. McKenney  * of the callback within the enclosing RCU-protected data structure,
354486e2593SPaul E. McKenney  * the fourth argument is the number of lazy callbacks queued, and the
355486e2593SPaul E. McKenney  * fifth argument is the total number of callbacks queued.
356d4c08f2aSPaul E. McKenney  */
357d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_kfree_callback,
358d4c08f2aSPaul E. McKenney 
359d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset,
360486e2593SPaul E. McKenney 		 long qlen_lazy, long qlen),
361d4c08f2aSPaul E. McKenney 
362486e2593SPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset, qlen_lazy, qlen),
363d4c08f2aSPaul E. McKenney 
364d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
365d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
366d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
367d4c08f2aSPaul E. McKenney 		__field(unsigned long, offset)
368486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
369d4c08f2aSPaul E. McKenney 		__field(long, qlen)
370d4c08f2aSPaul E. McKenney 	),
371d4c08f2aSPaul E. McKenney 
372d4c08f2aSPaul E. McKenney 	TP_fast_assign(
373d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
374d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
375d4c08f2aSPaul E. McKenney 		__entry->offset = offset;
376486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
377d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
378d4c08f2aSPaul E. McKenney 	),
379d4c08f2aSPaul E. McKenney 
380486e2593SPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld %ld/%ld",
381d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset,
382486e2593SPaul E. McKenney 		  __entry->qlen_lazy, __entry->qlen)
383d4c08f2aSPaul E. McKenney );
384d4c08f2aSPaul E. McKenney 
385300df91cSPaul E. McKenney /*
386300df91cSPaul E. McKenney  * Tracepoint for marking the beginning rcu_do_batch, performed to start
38772fe701bSPaul E. McKenney  * RCU callback invocation.  The first argument is the RCU flavor,
388486e2593SPaul E. McKenney  * the second is the number of lazy callbacks queued, the third is
389486e2593SPaul E. McKenney  * the total number of callbacks queued, and the fourth argument is
390486e2593SPaul E. McKenney  * the current RCU-callback batch limit.
39129c00b4aSPaul E. McKenney  */
39229c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_start,
39329c00b4aSPaul E. McKenney 
394486e2593SPaul E. McKenney 	TP_PROTO(char *rcuname, long qlen_lazy, long qlen, int blimit),
39529c00b4aSPaul E. McKenney 
396486e2593SPaul E. McKenney 	TP_ARGS(rcuname, qlen_lazy, qlen, blimit),
39729c00b4aSPaul E. McKenney 
39829c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
39972fe701bSPaul E. McKenney 		__field(char *, rcuname)
400486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
401300df91cSPaul E. McKenney 		__field(long, qlen)
40229c00b4aSPaul E. McKenney 		__field(int, blimit)
40329c00b4aSPaul E. McKenney 	),
40429c00b4aSPaul E. McKenney 
40529c00b4aSPaul E. McKenney 	TP_fast_assign(
40672fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
407486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
408300df91cSPaul E. McKenney 		__entry->qlen = qlen;
40929c00b4aSPaul E. McKenney 		__entry->blimit = blimit;
41029c00b4aSPaul E. McKenney 	),
41129c00b4aSPaul E. McKenney 
412486e2593SPaul E. McKenney 	TP_printk("%s CBs=%ld/%ld bl=%d",
413486e2593SPaul E. McKenney 		  __entry->rcuname, __entry->qlen_lazy, __entry->qlen,
414486e2593SPaul E. McKenney 		  __entry->blimit)
41529c00b4aSPaul E. McKenney );
41629c00b4aSPaul E. McKenney 
41729c00b4aSPaul E. McKenney /*
418300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback function.
419d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, and the second argument is
420d4c08f2aSPaul E. McKenney  * a pointer to the RCU callback itself.
42129c00b4aSPaul E. McKenney  */
42229c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_callback,
42329c00b4aSPaul E. McKenney 
424d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp),
42529c00b4aSPaul E. McKenney 
426d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp),
42729c00b4aSPaul E. McKenney 
42829c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
429d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
43029c00b4aSPaul E. McKenney 		__field(void *, rhp)
43129c00b4aSPaul E. McKenney 		__field(void *, func)
43229c00b4aSPaul E. McKenney 	),
43329c00b4aSPaul E. McKenney 
43429c00b4aSPaul E. McKenney 	TP_fast_assign(
435d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
43629c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
43729c00b4aSPaul E. McKenney 		__entry->func = rhp->func;
43829c00b4aSPaul E. McKenney 	),
43929c00b4aSPaul E. McKenney 
440d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf",
441d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func)
44229c00b4aSPaul E. McKenney );
44329c00b4aSPaul E. McKenney 
44429c00b4aSPaul E. McKenney /*
445300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback of the special
446d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU flavor, the second
447d4c08f2aSPaul E. McKenney  * argument is a pointer to the RCU callback, and the third argument
448d4c08f2aSPaul E. McKenney  * is the offset of the callback within the enclosing RCU-protected
449d4c08f2aSPaul E. McKenney  * data structure.
45029c00b4aSPaul E. McKenney  */
45129c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_kfree_callback,
45229c00b4aSPaul E. McKenney 
453d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset),
45429c00b4aSPaul E. McKenney 
455d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset),
45629c00b4aSPaul E. McKenney 
45729c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
458d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
45929c00b4aSPaul E. McKenney 		__field(void *, rhp)
46029c00b4aSPaul E. McKenney 		__field(unsigned long, offset)
46129c00b4aSPaul E. McKenney 	),
46229c00b4aSPaul E. McKenney 
46329c00b4aSPaul E. McKenney 	TP_fast_assign(
464d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
46529c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
46629c00b4aSPaul E. McKenney 		__entry->offset	= offset;
46729c00b4aSPaul E. McKenney 	),
46829c00b4aSPaul E. McKenney 
469d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld",
470d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset)
47129c00b4aSPaul E. McKenney );
47229c00b4aSPaul E. McKenney 
47329c00b4aSPaul E. McKenney /*
474300df91cSPaul E. McKenney  * Tracepoint for exiting rcu_do_batch after RCU callbacks have been
4754968c300SPaul E. McKenney  * invoked.  The first argument is the name of the RCU flavor,
4764968c300SPaul E. McKenney  * the second argument is number of callbacks actually invoked,
4774968c300SPaul E. McKenney  * the third argument (cb) is whether or not any of the callbacks that
4784968c300SPaul E. McKenney  * were ready to invoke at the beginning of this batch are still
4794968c300SPaul E. McKenney  * queued, the fourth argument (nr) is the return value of need_resched(),
4804968c300SPaul E. McKenney  * the fifth argument (iit) is 1 if the current task is the idle task,
4814968c300SPaul E. McKenney  * and the sixth argument (risk) is the return value from
4824968c300SPaul E. McKenney  * rcu_is_callbacks_kthread().
48329c00b4aSPaul E. McKenney  */
48429c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_end,
48529c00b4aSPaul E. McKenney 
4864968c300SPaul E. McKenney 	TP_PROTO(char *rcuname, int callbacks_invoked,
4874968c300SPaul E. McKenney 		 bool cb, bool nr, bool iit, bool risk),
48829c00b4aSPaul E. McKenney 
4894968c300SPaul E. McKenney 	TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),
49029c00b4aSPaul E. McKenney 
49129c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
49272fe701bSPaul E. McKenney 		__field(char *, rcuname)
49329c00b4aSPaul E. McKenney 		__field(int, callbacks_invoked)
4944968c300SPaul E. McKenney 		__field(bool, cb)
4954968c300SPaul E. McKenney 		__field(bool, nr)
4964968c300SPaul E. McKenney 		__field(bool, iit)
4974968c300SPaul E. McKenney 		__field(bool, risk)
49829c00b4aSPaul E. McKenney 	),
49929c00b4aSPaul E. McKenney 
50029c00b4aSPaul E. McKenney 	TP_fast_assign(
50172fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
50229c00b4aSPaul E. McKenney 		__entry->callbacks_invoked = callbacks_invoked;
5034968c300SPaul E. McKenney 		__entry->cb = cb;
5044968c300SPaul E. McKenney 		__entry->nr = nr;
5054968c300SPaul E. McKenney 		__entry->iit = iit;
5064968c300SPaul E. McKenney 		__entry->risk = risk;
50729c00b4aSPaul E. McKenney 	),
50829c00b4aSPaul E. McKenney 
5094968c300SPaul E. McKenney 	TP_printk("%s CBs-invoked=%d idle=%c%c%c%c",
5104968c300SPaul E. McKenney 		  __entry->rcuname, __entry->callbacks_invoked,
5114968c300SPaul E. McKenney 		  __entry->cb ? 'C' : '.',
5124968c300SPaul E. McKenney 		  __entry->nr ? 'S' : '.',
5134968c300SPaul E. McKenney 		  __entry->iit ? 'I' : '.',
5144968c300SPaul E. McKenney 		  __entry->risk ? 'R' : '.')
51529c00b4aSPaul E. McKenney );
51629c00b4aSPaul E. McKenney 
51791afaf30SPaul E. McKenney /*
51891afaf30SPaul E. McKenney  * Tracepoint for rcutorture readers.  The first argument is the name
51991afaf30SPaul E. McKenney  * of the RCU flavor from rcutorture's viewpoint and the second argument
52091afaf30SPaul E. McKenney  * is the callback address.
52191afaf30SPaul E. McKenney  */
52291afaf30SPaul E. McKenney TRACE_EVENT(rcu_torture_read,
52391afaf30SPaul E. McKenney 
52491afaf30SPaul E. McKenney 	TP_PROTO(char *rcutorturename, struct rcu_head *rhp),
52591afaf30SPaul E. McKenney 
52691afaf30SPaul E. McKenney 	TP_ARGS(rcutorturename, rhp),
52791afaf30SPaul E. McKenney 
52891afaf30SPaul E. McKenney 	TP_STRUCT__entry(
52991afaf30SPaul E. McKenney 		__field(char *, rcutorturename)
53091afaf30SPaul E. McKenney 		__field(struct rcu_head *, rhp)
53191afaf30SPaul E. McKenney 	),
53291afaf30SPaul E. McKenney 
53391afaf30SPaul E. McKenney 	TP_fast_assign(
53491afaf30SPaul E. McKenney 		__entry->rcutorturename = rcutorturename;
53591afaf30SPaul E. McKenney 		__entry->rhp = rhp;
53691afaf30SPaul E. McKenney 	),
53791afaf30SPaul E. McKenney 
53891afaf30SPaul E. McKenney 	TP_printk("%s torture read %p",
53991afaf30SPaul E. McKenney 		  __entry->rcutorturename, __entry->rhp)
54091afaf30SPaul E. McKenney );
54191afaf30SPaul E. McKenney 
542d4c08f2aSPaul E. McKenney #else /* #ifdef CONFIG_RCU_TRACE */
543d4c08f2aSPaul E. McKenney 
544d4c08f2aSPaul E. McKenney #define trace_rcu_grace_period(rcuname, gpnum, gpevent) do { } while (0)
545486e2593SPaul E. McKenney #define trace_rcu_grace_period_init(rcuname, gpnum, level, grplo, grphi, \
546486e2593SPaul E. McKenney 				    qsmask) do { } while (0)
547d4c08f2aSPaul E. McKenney #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)
548d4c08f2aSPaul E. McKenney #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)
549486e2593SPaul E. McKenney #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, \
550486e2593SPaul E. McKenney 					 grplo, grphi, gp_tasks) do { } \
551486e2593SPaul E. McKenney 	while (0)
552d4c08f2aSPaul E. McKenney #define trace_rcu_fqs(rcuname, gpnum, cpu, qsevent) do { } while (0)
5534145fa7fSPaul E. McKenney #define trace_rcu_dyntick(polarity, oldnesting, newnesting) do { } while (0)
554433cdddcSPaul E. McKenney #define trace_rcu_prep_idle(reason) do { } while (0)
555486e2593SPaul E. McKenney #define trace_rcu_callback(rcuname, rhp, qlen_lazy, qlen) do { } while (0)
556486e2593SPaul E. McKenney #define trace_rcu_kfree_callback(rcuname, rhp, offset, qlen_lazy, qlen) \
557486e2593SPaul E. McKenney 	do { } while (0)
558486e2593SPaul E. McKenney #define trace_rcu_batch_start(rcuname, qlen_lazy, qlen, blimit) \
559486e2593SPaul E. McKenney 	do { } while (0)
560d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_callback(rcuname, rhp) do { } while (0)
561d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_kfree_callback(rcuname, rhp, offset) do { } while (0)
5624968c300SPaul E. McKenney #define trace_rcu_batch_end(rcuname, callbacks_invoked, cb, nr, iit, risk) \
5634968c300SPaul E. McKenney 	do { } while (0)
56491afaf30SPaul E. McKenney #define trace_rcu_torture_read(rcutorturename, rhp) do { } while (0)
565d4c08f2aSPaul E. McKenney 
566d4c08f2aSPaul E. McKenney #endif /* #else #ifdef CONFIG_RCU_TRACE */
567d4c08f2aSPaul E. McKenney 
56829c00b4aSPaul E. McKenney #endif /* _TRACE_RCU_H */
56929c00b4aSPaul E. McKenney 
57029c00b4aSPaul E. McKenney /* This part must be outside protection */
57129c00b4aSPaul E. McKenney #include <trace/define_trace.h>
572