xref: /openbmc/linux/include/trace/events/rcu.h (revision fd4b3526)
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.
292fd4b3526SPaul E. McKenney  *	"Dyntick with lazy callbacks": Entering dyntick-idle w/lazy callbacks.
293433cdddcSPaul E. McKenney  *	"More callbacks": Still more callbacks, try again to clear them out.
294433cdddcSPaul E. McKenney  *	"Callbacks drained": All callbacks processed, off to dyntick idle!
2957cb92499SPaul E. McKenney  *	"Timer": Timer fired to cause CPU to continue processing callbacks.
29621e52e15SPaul E. McKenney  *	"Demigrate": Timer fired on wrong CPU, woke up correct CPU.
2972fdbb31bSPaul E. McKenney  *	"Cleanup after idle": Idle exited, timer canceled.
298433cdddcSPaul E. McKenney  */
299433cdddcSPaul E. McKenney TRACE_EVENT(rcu_prep_idle,
300433cdddcSPaul E. McKenney 
301433cdddcSPaul E. McKenney 	TP_PROTO(char *reason),
302433cdddcSPaul E. McKenney 
303433cdddcSPaul E. McKenney 	TP_ARGS(reason),
304433cdddcSPaul E. McKenney 
305433cdddcSPaul E. McKenney 	TP_STRUCT__entry(
306433cdddcSPaul E. McKenney 		__field(char *, reason)
307433cdddcSPaul E. McKenney 	),
308433cdddcSPaul E. McKenney 
309433cdddcSPaul E. McKenney 	TP_fast_assign(
310433cdddcSPaul E. McKenney 		__entry->reason = reason;
311433cdddcSPaul E. McKenney 	),
312433cdddcSPaul E. McKenney 
313433cdddcSPaul E. McKenney 	TP_printk("%s", __entry->reason)
314433cdddcSPaul E. McKenney );
315433cdddcSPaul E. McKenney 
316433cdddcSPaul E. McKenney /*
317d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback function.
318d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, the second argument is
319486e2593SPaul E. McKenney  * a pointer to the RCU callback itself, the third element is the
320486e2593SPaul E. McKenney  * number of lazy callbacks queued, and the fourth element is the
321486e2593SPaul E. McKenney  * total number of callbacks queued.
322d4c08f2aSPaul E. McKenney  */
323d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_callback,
324d4c08f2aSPaul E. McKenney 
325486e2593SPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, long qlen_lazy,
326486e2593SPaul E. McKenney 		 long qlen),
327d4c08f2aSPaul E. McKenney 
328486e2593SPaul E. McKenney 	TP_ARGS(rcuname, rhp, qlen_lazy, qlen),
329d4c08f2aSPaul E. McKenney 
330d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
331d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
332d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
333d4c08f2aSPaul E. McKenney 		__field(void *, func)
334486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
335d4c08f2aSPaul E. McKenney 		__field(long, qlen)
336d4c08f2aSPaul E. McKenney 	),
337d4c08f2aSPaul E. McKenney 
338d4c08f2aSPaul E. McKenney 	TP_fast_assign(
339d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
340d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
341d4c08f2aSPaul E. McKenney 		__entry->func = rhp->func;
342486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
343d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
344d4c08f2aSPaul E. McKenney 	),
345d4c08f2aSPaul E. McKenney 
346486e2593SPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf %ld/%ld",
347486e2593SPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func,
348486e2593SPaul E. McKenney 		  __entry->qlen_lazy, __entry->qlen)
349d4c08f2aSPaul E. McKenney );
350d4c08f2aSPaul E. McKenney 
351d4c08f2aSPaul E. McKenney /*
352d4c08f2aSPaul E. McKenney  * Tracepoint for the registration of a single RCU callback of the special
353d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU type, the second argument
354d4c08f2aSPaul E. McKenney  * is a pointer to the RCU callback, the third argument is the offset
355d4c08f2aSPaul E. McKenney  * of the callback within the enclosing RCU-protected data structure,
356486e2593SPaul E. McKenney  * the fourth argument is the number of lazy callbacks queued, and the
357486e2593SPaul E. McKenney  * fifth argument is the total number of callbacks queued.
358d4c08f2aSPaul E. McKenney  */
359d4c08f2aSPaul E. McKenney TRACE_EVENT(rcu_kfree_callback,
360d4c08f2aSPaul E. McKenney 
361d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset,
362486e2593SPaul E. McKenney 		 long qlen_lazy, long qlen),
363d4c08f2aSPaul E. McKenney 
364486e2593SPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset, qlen_lazy, qlen),
365d4c08f2aSPaul E. McKenney 
366d4c08f2aSPaul E. McKenney 	TP_STRUCT__entry(
367d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
368d4c08f2aSPaul E. McKenney 		__field(void *, rhp)
369d4c08f2aSPaul E. McKenney 		__field(unsigned long, offset)
370486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
371d4c08f2aSPaul E. McKenney 		__field(long, qlen)
372d4c08f2aSPaul E. McKenney 	),
373d4c08f2aSPaul E. McKenney 
374d4c08f2aSPaul E. McKenney 	TP_fast_assign(
375d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
376d4c08f2aSPaul E. McKenney 		__entry->rhp = rhp;
377d4c08f2aSPaul E. McKenney 		__entry->offset = offset;
378486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
379d4c08f2aSPaul E. McKenney 		__entry->qlen = qlen;
380d4c08f2aSPaul E. McKenney 	),
381d4c08f2aSPaul E. McKenney 
382486e2593SPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld %ld/%ld",
383d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset,
384486e2593SPaul E. McKenney 		  __entry->qlen_lazy, __entry->qlen)
385d4c08f2aSPaul E. McKenney );
386d4c08f2aSPaul E. McKenney 
387300df91cSPaul E. McKenney /*
388300df91cSPaul E. McKenney  * Tracepoint for marking the beginning rcu_do_batch, performed to start
38972fe701bSPaul E. McKenney  * RCU callback invocation.  The first argument is the RCU flavor,
390486e2593SPaul E. McKenney  * the second is the number of lazy callbacks queued, the third is
391486e2593SPaul E. McKenney  * the total number of callbacks queued, and the fourth argument is
392486e2593SPaul E. McKenney  * the current RCU-callback batch limit.
39329c00b4aSPaul E. McKenney  */
39429c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_start,
39529c00b4aSPaul E. McKenney 
396486e2593SPaul E. McKenney 	TP_PROTO(char *rcuname, long qlen_lazy, long qlen, int blimit),
39729c00b4aSPaul E. McKenney 
398486e2593SPaul E. McKenney 	TP_ARGS(rcuname, qlen_lazy, qlen, blimit),
39929c00b4aSPaul E. McKenney 
40029c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
40172fe701bSPaul E. McKenney 		__field(char *, rcuname)
402486e2593SPaul E. McKenney 		__field(long, qlen_lazy)
403300df91cSPaul E. McKenney 		__field(long, qlen)
40429c00b4aSPaul E. McKenney 		__field(int, blimit)
40529c00b4aSPaul E. McKenney 	),
40629c00b4aSPaul E. McKenney 
40729c00b4aSPaul E. McKenney 	TP_fast_assign(
40872fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
409486e2593SPaul E. McKenney 		__entry->qlen_lazy = qlen_lazy;
410300df91cSPaul E. McKenney 		__entry->qlen = qlen;
41129c00b4aSPaul E. McKenney 		__entry->blimit = blimit;
41229c00b4aSPaul E. McKenney 	),
41329c00b4aSPaul E. McKenney 
414486e2593SPaul E. McKenney 	TP_printk("%s CBs=%ld/%ld bl=%d",
415486e2593SPaul E. McKenney 		  __entry->rcuname, __entry->qlen_lazy, __entry->qlen,
416486e2593SPaul E. McKenney 		  __entry->blimit)
41729c00b4aSPaul E. McKenney );
41829c00b4aSPaul E. McKenney 
41929c00b4aSPaul E. McKenney /*
420300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback function.
421d4c08f2aSPaul E. McKenney  * The first argument is the type of RCU, and the second argument is
422d4c08f2aSPaul E. McKenney  * a pointer to the RCU callback itself.
42329c00b4aSPaul E. McKenney  */
42429c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_callback,
42529c00b4aSPaul E. McKenney 
426d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp),
42729c00b4aSPaul E. McKenney 
428d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp),
42929c00b4aSPaul E. McKenney 
43029c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
431d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
43229c00b4aSPaul E. McKenney 		__field(void *, rhp)
43329c00b4aSPaul E. McKenney 		__field(void *, func)
43429c00b4aSPaul E. McKenney 	),
43529c00b4aSPaul E. McKenney 
43629c00b4aSPaul E. McKenney 	TP_fast_assign(
437d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
43829c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
43929c00b4aSPaul E. McKenney 		__entry->func = rhp->func;
44029c00b4aSPaul E. McKenney 	),
44129c00b4aSPaul E. McKenney 
442d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%pf",
443d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->func)
44429c00b4aSPaul E. McKenney );
44529c00b4aSPaul E. McKenney 
44629c00b4aSPaul E. McKenney /*
447300df91cSPaul E. McKenney  * Tracepoint for the invocation of a single RCU callback of the special
448d4c08f2aSPaul E. McKenney  * kfree() form.  The first argument is the RCU flavor, the second
449d4c08f2aSPaul E. McKenney  * argument is a pointer to the RCU callback, and the third argument
450d4c08f2aSPaul E. McKenney  * is the offset of the callback within the enclosing RCU-protected
451d4c08f2aSPaul E. McKenney  * data structure.
45229c00b4aSPaul E. McKenney  */
45329c00b4aSPaul E. McKenney TRACE_EVENT(rcu_invoke_kfree_callback,
45429c00b4aSPaul E. McKenney 
455d4c08f2aSPaul E. McKenney 	TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset),
45629c00b4aSPaul E. McKenney 
457d4c08f2aSPaul E. McKenney 	TP_ARGS(rcuname, rhp, offset),
45829c00b4aSPaul E. McKenney 
45929c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
460d4c08f2aSPaul E. McKenney 		__field(char *, rcuname)
46129c00b4aSPaul E. McKenney 		__field(void *, rhp)
46229c00b4aSPaul E. McKenney 		__field(unsigned long, offset)
46329c00b4aSPaul E. McKenney 	),
46429c00b4aSPaul E. McKenney 
46529c00b4aSPaul E. McKenney 	TP_fast_assign(
466d4c08f2aSPaul E. McKenney 		__entry->rcuname = rcuname;
46729c00b4aSPaul E. McKenney 		__entry->rhp = rhp;
46829c00b4aSPaul E. McKenney 		__entry->offset	= offset;
46929c00b4aSPaul E. McKenney 	),
47029c00b4aSPaul E. McKenney 
471d4c08f2aSPaul E. McKenney 	TP_printk("%s rhp=%p func=%ld",
472d4c08f2aSPaul E. McKenney 		  __entry->rcuname, __entry->rhp, __entry->offset)
47329c00b4aSPaul E. McKenney );
47429c00b4aSPaul E. McKenney 
47529c00b4aSPaul E. McKenney /*
476300df91cSPaul E. McKenney  * Tracepoint for exiting rcu_do_batch after RCU callbacks have been
4774968c300SPaul E. McKenney  * invoked.  The first argument is the name of the RCU flavor,
4784968c300SPaul E. McKenney  * the second argument is number of callbacks actually invoked,
4794968c300SPaul E. McKenney  * the third argument (cb) is whether or not any of the callbacks that
4804968c300SPaul E. McKenney  * were ready to invoke at the beginning of this batch are still
4814968c300SPaul E. McKenney  * queued, the fourth argument (nr) is the return value of need_resched(),
4824968c300SPaul E. McKenney  * the fifth argument (iit) is 1 if the current task is the idle task,
4834968c300SPaul E. McKenney  * and the sixth argument (risk) is the return value from
4844968c300SPaul E. McKenney  * rcu_is_callbacks_kthread().
48529c00b4aSPaul E. McKenney  */
48629c00b4aSPaul E. McKenney TRACE_EVENT(rcu_batch_end,
48729c00b4aSPaul E. McKenney 
4884968c300SPaul E. McKenney 	TP_PROTO(char *rcuname, int callbacks_invoked,
4894968c300SPaul E. McKenney 		 bool cb, bool nr, bool iit, bool risk),
49029c00b4aSPaul E. McKenney 
4914968c300SPaul E. McKenney 	TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),
49229c00b4aSPaul E. McKenney 
49329c00b4aSPaul E. McKenney 	TP_STRUCT__entry(
49472fe701bSPaul E. McKenney 		__field(char *, rcuname)
49529c00b4aSPaul E. McKenney 		__field(int, callbacks_invoked)
4964968c300SPaul E. McKenney 		__field(bool, cb)
4974968c300SPaul E. McKenney 		__field(bool, nr)
4984968c300SPaul E. McKenney 		__field(bool, iit)
4994968c300SPaul E. McKenney 		__field(bool, risk)
50029c00b4aSPaul E. McKenney 	),
50129c00b4aSPaul E. McKenney 
50229c00b4aSPaul E. McKenney 	TP_fast_assign(
50372fe701bSPaul E. McKenney 		__entry->rcuname = rcuname;
50429c00b4aSPaul E. McKenney 		__entry->callbacks_invoked = callbacks_invoked;
5054968c300SPaul E. McKenney 		__entry->cb = cb;
5064968c300SPaul E. McKenney 		__entry->nr = nr;
5074968c300SPaul E. McKenney 		__entry->iit = iit;
5084968c300SPaul E. McKenney 		__entry->risk = risk;
50929c00b4aSPaul E. McKenney 	),
51029c00b4aSPaul E. McKenney 
5114968c300SPaul E. McKenney 	TP_printk("%s CBs-invoked=%d idle=%c%c%c%c",
5124968c300SPaul E. McKenney 		  __entry->rcuname, __entry->callbacks_invoked,
5134968c300SPaul E. McKenney 		  __entry->cb ? 'C' : '.',
5144968c300SPaul E. McKenney 		  __entry->nr ? 'S' : '.',
5154968c300SPaul E. McKenney 		  __entry->iit ? 'I' : '.',
5164968c300SPaul E. McKenney 		  __entry->risk ? 'R' : '.')
51729c00b4aSPaul E. McKenney );
51829c00b4aSPaul E. McKenney 
51991afaf30SPaul E. McKenney /*
52091afaf30SPaul E. McKenney  * Tracepoint for rcutorture readers.  The first argument is the name
52191afaf30SPaul E. McKenney  * of the RCU flavor from rcutorture's viewpoint and the second argument
52291afaf30SPaul E. McKenney  * is the callback address.
52391afaf30SPaul E. McKenney  */
52491afaf30SPaul E. McKenney TRACE_EVENT(rcu_torture_read,
52591afaf30SPaul E. McKenney 
52691afaf30SPaul E. McKenney 	TP_PROTO(char *rcutorturename, struct rcu_head *rhp),
52791afaf30SPaul E. McKenney 
52891afaf30SPaul E. McKenney 	TP_ARGS(rcutorturename, rhp),
52991afaf30SPaul E. McKenney 
53091afaf30SPaul E. McKenney 	TP_STRUCT__entry(
53191afaf30SPaul E. McKenney 		__field(char *, rcutorturename)
53291afaf30SPaul E. McKenney 		__field(struct rcu_head *, rhp)
53391afaf30SPaul E. McKenney 	),
53491afaf30SPaul E. McKenney 
53591afaf30SPaul E. McKenney 	TP_fast_assign(
53691afaf30SPaul E. McKenney 		__entry->rcutorturename = rcutorturename;
53791afaf30SPaul E. McKenney 		__entry->rhp = rhp;
53891afaf30SPaul E. McKenney 	),
53991afaf30SPaul E. McKenney 
54091afaf30SPaul E. McKenney 	TP_printk("%s torture read %p",
54191afaf30SPaul E. McKenney 		  __entry->rcutorturename, __entry->rhp)
54291afaf30SPaul E. McKenney );
54391afaf30SPaul E. McKenney 
544d4c08f2aSPaul E. McKenney #else /* #ifdef CONFIG_RCU_TRACE */
545d4c08f2aSPaul E. McKenney 
546d4c08f2aSPaul E. McKenney #define trace_rcu_grace_period(rcuname, gpnum, gpevent) do { } while (0)
547486e2593SPaul E. McKenney #define trace_rcu_grace_period_init(rcuname, gpnum, level, grplo, grphi, \
548486e2593SPaul E. McKenney 				    qsmask) do { } while (0)
549d4c08f2aSPaul E. McKenney #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)
550d4c08f2aSPaul E. McKenney #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)
551486e2593SPaul E. McKenney #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, \
552486e2593SPaul E. McKenney 					 grplo, grphi, gp_tasks) do { } \
553486e2593SPaul E. McKenney 	while (0)
554d4c08f2aSPaul E. McKenney #define trace_rcu_fqs(rcuname, gpnum, cpu, qsevent) do { } while (0)
5554145fa7fSPaul E. McKenney #define trace_rcu_dyntick(polarity, oldnesting, newnesting) do { } while (0)
556433cdddcSPaul E. McKenney #define trace_rcu_prep_idle(reason) do { } while (0)
557486e2593SPaul E. McKenney #define trace_rcu_callback(rcuname, rhp, qlen_lazy, qlen) do { } while (0)
558486e2593SPaul E. McKenney #define trace_rcu_kfree_callback(rcuname, rhp, offset, qlen_lazy, qlen) \
559486e2593SPaul E. McKenney 	do { } while (0)
560486e2593SPaul E. McKenney #define trace_rcu_batch_start(rcuname, qlen_lazy, qlen, blimit) \
561486e2593SPaul E. McKenney 	do { } while (0)
562d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_callback(rcuname, rhp) do { } while (0)
563d4c08f2aSPaul E. McKenney #define trace_rcu_invoke_kfree_callback(rcuname, rhp, offset) do { } while (0)
5644968c300SPaul E. McKenney #define trace_rcu_batch_end(rcuname, callbacks_invoked, cb, nr, iit, risk) \
5654968c300SPaul E. McKenney 	do { } while (0)
56691afaf30SPaul E. McKenney #define trace_rcu_torture_read(rcutorturename, rhp) do { } while (0)
567d4c08f2aSPaul E. McKenney 
568d4c08f2aSPaul E. McKenney #endif /* #else #ifdef CONFIG_RCU_TRACE */
569d4c08f2aSPaul E. McKenney 
57029c00b4aSPaul E. McKenney #endif /* _TRACE_RCU_H */
57129c00b4aSPaul E. McKenney 
57229c00b4aSPaul E. McKenney /* This part must be outside protection */
57329c00b4aSPaul E. McKenney #include <trace/define_trace.h>
574