1#undef TRACE_SYSTEM
2#define TRACE_SYSTEM rcu
3
4#if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ)
5#define _TRACE_RCU_H
6
7#include <linux/tracepoint.h>
8
9
10
11
12
13
14
15
16
17
18
19
20TRACE_EVENT(rcu_utilization,
21
22 TP_PROTO(const char *s),
23
24 TP_ARGS(s),
25
26 TP_STRUCT__entry(
27 __field(const char *, s)
28 ),
29
30 TP_fast_assign(
31 __entry->s = s;
32 ),
33
34 TP_printk("%s", __entry->s)
35);
36
37#ifdef CONFIG_RCU_TRACE
38
39#if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63TRACE_EVENT(rcu_grace_period,
64
65 TP_PROTO(const char *rcuname, unsigned long gpnum, const char *gpevent),
66
67 TP_ARGS(rcuname, gpnum, gpevent),
68
69 TP_STRUCT__entry(
70 __field(const char *, rcuname)
71 __field(unsigned long, gpnum)
72 __field(const char *, gpevent)
73 ),
74
75 TP_fast_assign(
76 __entry->rcuname = rcuname;
77 __entry->gpnum = gpnum;
78 __entry->gpevent = gpevent;
79 ),
80
81 TP_printk("%s %lu %s",
82 __entry->rcuname, __entry->gpnum, __entry->gpevent)
83);
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101TRACE_EVENT(rcu_future_grace_period,
102
103 TP_PROTO(const char *rcuname, unsigned long gpnum, unsigned long completed,
104 unsigned long c, u8 level, int grplo, int grphi,
105 const char *gpevent),
106
107 TP_ARGS(rcuname, gpnum, completed, c, level, grplo, grphi, gpevent),
108
109 TP_STRUCT__entry(
110 __field(const char *, rcuname)
111 __field(unsigned long, gpnum)
112 __field(unsigned long, completed)
113 __field(unsigned long, c)
114 __field(u8, level)
115 __field(int, grplo)
116 __field(int, grphi)
117 __field(const char *, gpevent)
118 ),
119
120 TP_fast_assign(
121 __entry->rcuname = rcuname;
122 __entry->gpnum = gpnum;
123 __entry->completed = completed;
124 __entry->c = c;
125 __entry->level = level;
126 __entry->grplo = grplo;
127 __entry->grphi = grphi;
128 __entry->gpevent = gpevent;
129 ),
130
131 TP_printk("%s %lu %lu %lu %u %d %d %s",
132 __entry->rcuname, __entry->gpnum, __entry->completed,
133 __entry->c, __entry->level, __entry->grplo, __entry->grphi,
134 __entry->gpevent)
135);
136
137
138
139
140
141
142
143
144TRACE_EVENT(rcu_grace_period_init,
145
146 TP_PROTO(const char *rcuname, unsigned long gpnum, u8 level,
147 int grplo, int grphi, unsigned long qsmask),
148
149 TP_ARGS(rcuname, gpnum, level, grplo, grphi, qsmask),
150
151 TP_STRUCT__entry(
152 __field(const char *, rcuname)
153 __field(unsigned long, gpnum)
154 __field(u8, level)
155 __field(int, grplo)
156 __field(int, grphi)
157 __field(unsigned long, qsmask)
158 ),
159
160 TP_fast_assign(
161 __entry->rcuname = rcuname;
162 __entry->gpnum = gpnum;
163 __entry->level = level;
164 __entry->grplo = grplo;
165 __entry->grphi = grphi;
166 __entry->qsmask = qsmask;
167 ),
168
169 TP_printk("%s %lu %u %d %d %lx",
170 __entry->rcuname, __entry->gpnum, __entry->level,
171 __entry->grplo, __entry->grphi, __entry->qsmask)
172);
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193TRACE_EVENT(rcu_nocb_wake,
194
195 TP_PROTO(const char *rcuname, int cpu, const char *reason),
196
197 TP_ARGS(rcuname, cpu, reason),
198
199 TP_STRUCT__entry(
200 __field(const char *, rcuname)
201 __field(int, cpu)
202 __field(const char *, reason)
203 ),
204
205 TP_fast_assign(
206 __entry->rcuname = rcuname;
207 __entry->cpu = cpu;
208 __entry->reason = reason;
209 ),
210
211 TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason)
212);
213
214
215
216
217
218
219
220TRACE_EVENT(rcu_preempt_task,
221
222 TP_PROTO(const char *rcuname, int pid, unsigned long gpnum),
223
224 TP_ARGS(rcuname, pid, gpnum),
225
226 TP_STRUCT__entry(
227 __field(const char *, rcuname)
228 __field(unsigned long, gpnum)
229 __field(int, pid)
230 ),
231
232 TP_fast_assign(
233 __entry->rcuname = rcuname;
234 __entry->gpnum = gpnum;
235 __entry->pid = pid;
236 ),
237
238 TP_printk("%s %lu %d",
239 __entry->rcuname, __entry->gpnum, __entry->pid)
240);
241
242
243
244
245
246
247TRACE_EVENT(rcu_unlock_preempted_task,
248
249 TP_PROTO(const char *rcuname, unsigned long gpnum, int pid),
250
251 TP_ARGS(rcuname, gpnum, pid),
252
253 TP_STRUCT__entry(
254 __field(const char *, rcuname)
255 __field(unsigned long, gpnum)
256 __field(int, pid)
257 ),
258
259 TP_fast_assign(
260 __entry->rcuname = rcuname;
261 __entry->gpnum = gpnum;
262 __entry->pid = pid;
263 ),
264
265 TP_printk("%s %lu %d", __entry->rcuname, __entry->gpnum, __entry->pid)
266);
267
268
269
270
271
272
273
274
275
276TRACE_EVENT(rcu_quiescent_state_report,
277
278 TP_PROTO(const char *rcuname, unsigned long gpnum,
279 unsigned long mask, unsigned long qsmask,
280 u8 level, int grplo, int grphi, int gp_tasks),
281
282 TP_ARGS(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks),
283
284 TP_STRUCT__entry(
285 __field(const char *, rcuname)
286 __field(unsigned long, gpnum)
287 __field(unsigned long, mask)
288 __field(unsigned long, qsmask)
289 __field(u8, level)
290 __field(int, grplo)
291 __field(int, grphi)
292 __field(u8, gp_tasks)
293 ),
294
295 TP_fast_assign(
296 __entry->rcuname = rcuname;
297 __entry->gpnum = gpnum;
298 __entry->mask = mask;
299 __entry->qsmask = qsmask;
300 __entry->level = level;
301 __entry->grplo = grplo;
302 __entry->grphi = grphi;
303 __entry->gp_tasks = gp_tasks;
304 ),
305
306 TP_printk("%s %lu %lx>%lx %u %d %d %u",
307 __entry->rcuname, __entry->gpnum,
308 __entry->mask, __entry->qsmask, __entry->level,
309 __entry->grplo, __entry->grphi, __entry->gp_tasks)
310);
311
312
313
314
315
316
317
318
319
320TRACE_EVENT(rcu_fqs,
321
322 TP_PROTO(const char *rcuname, unsigned long gpnum, int cpu, const char *qsevent),
323
324 TP_ARGS(rcuname, gpnum, cpu, qsevent),
325
326 TP_STRUCT__entry(
327 __field(const char *, rcuname)
328 __field(unsigned long, gpnum)
329 __field(int, cpu)
330 __field(const char *, qsevent)
331 ),
332
333 TP_fast_assign(
334 __entry->rcuname = rcuname;
335 __entry->gpnum = gpnum;
336 __entry->cpu = cpu;
337 __entry->qsevent = qsevent;
338 ),
339
340 TP_printk("%s %lu %d %s",
341 __entry->rcuname, __entry->gpnum,
342 __entry->cpu, __entry->qsevent)
343);
344
345#endif
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360TRACE_EVENT(rcu_dyntick,
361
362 TP_PROTO(const char *polarity, long long oldnesting, long long newnesting),
363
364 TP_ARGS(polarity, oldnesting, newnesting),
365
366 TP_STRUCT__entry(
367 __field(const char *, polarity)
368 __field(long long, oldnesting)
369 __field(long long, newnesting)
370 ),
371
372 TP_fast_assign(
373 __entry->polarity = polarity;
374 __entry->oldnesting = oldnesting;
375 __entry->newnesting = newnesting;
376 ),
377
378 TP_printk("%s %llx %llx", __entry->polarity,
379 __entry->oldnesting, __entry->newnesting)
380);
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404TRACE_EVENT(rcu_prep_idle,
405
406 TP_PROTO(const char *reason),
407
408 TP_ARGS(reason),
409
410 TP_STRUCT__entry(
411 __field(const char *, reason)
412 ),
413
414 TP_fast_assign(
415 __entry->reason = reason;
416 ),
417
418 TP_printk("%s", __entry->reason)
419);
420
421
422
423
424
425
426
427
428TRACE_EVENT(rcu_callback,
429
430 TP_PROTO(const char *rcuname, struct rcu_head *rhp, long qlen_lazy,
431 long qlen),
432
433 TP_ARGS(rcuname, rhp, qlen_lazy, qlen),
434
435 TP_STRUCT__entry(
436 __field(const char *, rcuname)
437 __field(void *, rhp)
438 __field(void *, func)
439 __field(long, qlen_lazy)
440 __field(long, qlen)
441 ),
442
443 TP_fast_assign(
444 __entry->rcuname = rcuname;
445 __entry->rhp = rhp;
446 __entry->func = rhp->func;
447 __entry->qlen_lazy = qlen_lazy;
448 __entry->qlen = qlen;
449 ),
450
451 TP_printk("%s rhp=%p func=%pf %ld/%ld",
452 __entry->rcuname, __entry->rhp, __entry->func,
453 __entry->qlen_lazy, __entry->qlen)
454);
455
456
457
458
459
460
461
462
463
464TRACE_EVENT(rcu_kfree_callback,
465
466 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset,
467 long qlen_lazy, long qlen),
468
469 TP_ARGS(rcuname, rhp, offset, qlen_lazy, qlen),
470
471 TP_STRUCT__entry(
472 __field(const char *, rcuname)
473 __field(void *, rhp)
474 __field(unsigned long, offset)
475 __field(long, qlen_lazy)
476 __field(long, qlen)
477 ),
478
479 TP_fast_assign(
480 __entry->rcuname = rcuname;
481 __entry->rhp = rhp;
482 __entry->offset = offset;
483 __entry->qlen_lazy = qlen_lazy;
484 __entry->qlen = qlen;
485 ),
486
487 TP_printk("%s rhp=%p func=%ld %ld/%ld",
488 __entry->rcuname, __entry->rhp, __entry->offset,
489 __entry->qlen_lazy, __entry->qlen)
490);
491
492
493
494
495
496
497
498
499TRACE_EVENT(rcu_batch_start,
500
501 TP_PROTO(const char *rcuname, long qlen_lazy, long qlen, long blimit),
502
503 TP_ARGS(rcuname, qlen_lazy, qlen, blimit),
504
505 TP_STRUCT__entry(
506 __field(const char *, rcuname)
507 __field(long, qlen_lazy)
508 __field(long, qlen)
509 __field(long, blimit)
510 ),
511
512 TP_fast_assign(
513 __entry->rcuname = rcuname;
514 __entry->qlen_lazy = qlen_lazy;
515 __entry->qlen = qlen;
516 __entry->blimit = blimit;
517 ),
518
519 TP_printk("%s CBs=%ld/%ld bl=%ld",
520 __entry->rcuname, __entry->qlen_lazy, __entry->qlen,
521 __entry->blimit)
522);
523
524
525
526
527
528
529TRACE_EVENT(rcu_invoke_callback,
530
531 TP_PROTO(const char *rcuname, struct rcu_head *rhp),
532
533 TP_ARGS(rcuname, rhp),
534
535 TP_STRUCT__entry(
536 __field(const char *, rcuname)
537 __field(void *, rhp)
538 __field(void *, func)
539 ),
540
541 TP_fast_assign(
542 __entry->rcuname = rcuname;
543 __entry->rhp = rhp;
544 __entry->func = rhp->func;
545 ),
546
547 TP_printk("%s rhp=%p func=%pf",
548 __entry->rcuname, __entry->rhp, __entry->func)
549);
550
551
552
553
554
555
556
557
558TRACE_EVENT(rcu_invoke_kfree_callback,
559
560 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset),
561
562 TP_ARGS(rcuname, rhp, offset),
563
564 TP_STRUCT__entry(
565 __field(const char *, rcuname)
566 __field(void *, rhp)
567 __field(unsigned long, offset)
568 ),
569
570 TP_fast_assign(
571 __entry->rcuname = rcuname;
572 __entry->rhp = rhp;
573 __entry->offset = offset;
574 ),
575
576 TP_printk("%s rhp=%p func=%ld",
577 __entry->rcuname, __entry->rhp, __entry->offset)
578);
579
580
581
582
583
584
585
586
587
588
589
590
591TRACE_EVENT(rcu_batch_end,
592
593 TP_PROTO(const char *rcuname, int callbacks_invoked,
594 char cb, char nr, char iit, char risk),
595
596 TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),
597
598 TP_STRUCT__entry(
599 __field(const char *, rcuname)
600 __field(int, callbacks_invoked)
601 __field(char, cb)
602 __field(char, nr)
603 __field(char, iit)
604 __field(char, risk)
605 ),
606
607 TP_fast_assign(
608 __entry->rcuname = rcuname;
609 __entry->callbacks_invoked = callbacks_invoked;
610 __entry->cb = cb;
611 __entry->nr = nr;
612 __entry->iit = iit;
613 __entry->risk = risk;
614 ),
615
616 TP_printk("%s CBs-invoked=%d idle=%c%c%c%c",
617 __entry->rcuname, __entry->callbacks_invoked,
618 __entry->cb ? 'C' : '.',
619 __entry->nr ? 'S' : '.',
620 __entry->iit ? 'I' : '.',
621 __entry->risk ? 'R' : '.')
622);
623
624
625
626
627
628
629TRACE_EVENT(rcu_torture_read,
630
631 TP_PROTO(const char *rcutorturename, struct rcu_head *rhp,
632 unsigned long secs, unsigned long c_old, unsigned long c),
633
634 TP_ARGS(rcutorturename, rhp, secs, c_old, c),
635
636 TP_STRUCT__entry(
637 __field(const char *, rcutorturename)
638 __field(struct rcu_head *, rhp)
639 __field(unsigned long, secs)
640 __field(unsigned long, c_old)
641 __field(unsigned long, c)
642 ),
643
644 TP_fast_assign(
645 __entry->rcutorturename = rcutorturename;
646 __entry->rhp = rhp;
647 __entry->secs = secs;
648 __entry->c_old = c_old;
649 __entry->c = c;
650 ),
651
652 TP_printk("%s torture read %p %luus c: %lu %lu",
653 __entry->rcutorturename, __entry->rhp,
654 __entry->secs, __entry->c_old, __entry->c)
655);
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675TRACE_EVENT(rcu_barrier,
676
677 TP_PROTO(const char *rcuname, const char *s, int cpu, int cnt, unsigned long done),
678
679 TP_ARGS(rcuname, s, cpu, cnt, done),
680
681 TP_STRUCT__entry(
682 __field(const char *, rcuname)
683 __field(const char *, s)
684 __field(int, cpu)
685 __field(int, cnt)
686 __field(unsigned long, done)
687 ),
688
689 TP_fast_assign(
690 __entry->rcuname = rcuname;
691 __entry->s = s;
692 __entry->cpu = cpu;
693 __entry->cnt = cnt;
694 __entry->done = done;
695 ),
696
697 TP_printk("%s %s cpu %d remaining %d # %lu",
698 __entry->rcuname, __entry->s, __entry->cpu, __entry->cnt,
699 __entry->done)
700);
701
702#else
703
704#define trace_rcu_grace_period(rcuname, gpnum, gpevent) do { } while (0)
705#define trace_rcu_grace_period_init(rcuname, gpnum, level, grplo, grphi, \
706 qsmask) do { } while (0)
707#define trace_rcu_future_grace_period(rcuname, gpnum, completed, c, \
708 level, grplo, grphi, event) \
709 do { } while (0)
710#define trace_rcu_nocb_wake(rcuname, cpu, reason) do { } while (0)
711#define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)
712#define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)
713#define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, \
714 grplo, grphi, gp_tasks) do { } \
715 while (0)
716#define trace_rcu_fqs(rcuname, gpnum, cpu, qsevent) do { } while (0)
717#define trace_rcu_dyntick(polarity, oldnesting, newnesting) do { } while (0)
718#define trace_rcu_prep_idle(reason) do { } while (0)
719#define trace_rcu_callback(rcuname, rhp, qlen_lazy, qlen) do { } while (0)
720#define trace_rcu_kfree_callback(rcuname, rhp, offset, qlen_lazy, qlen) \
721 do { } while (0)
722#define trace_rcu_batch_start(rcuname, qlen_lazy, qlen, blimit) \
723 do { } while (0)
724#define trace_rcu_invoke_callback(rcuname, rhp) do { } while (0)
725#define trace_rcu_invoke_kfree_callback(rcuname, rhp, offset) do { } while (0)
726#define trace_rcu_batch_end(rcuname, callbacks_invoked, cb, nr, iit, risk) \
727 do { } while (0)
728#define trace_rcu_torture_read(rcutorturename, rhp, secs, c_old, c) \
729 do { } while (0)
730#define trace_rcu_barrier(name, s, cpu, cnt, done) do { } while (0)
731
732#endif
733
734#endif
735
736
737#include <trace/define_trace.h>
738