865 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#undef TRACE_SYSTEM3#define TRACE_SYSTEM rcu4 5#if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ)6#define _TRACE_RCU_H7 8#include <linux/tracepoint.h>9 10#ifdef CONFIG_RCU_TRACE11#define TRACE_EVENT_RCU TRACE_EVENT12#else13#define TRACE_EVENT_RCU TRACE_EVENT_NOP14#endif15 16/*17 * Tracepoint for start/end markers used for utilization calculations.18 * By convention, the string is of the following forms:19 *20 * "Start <activity>" -- Mark the start of the specified activity,21 * such as "context switch". Nesting is permitted.22 * "End <activity>" -- Mark the end of the specified activity.23 *24 * An "@" character within "<activity>" is a comment character: Data25 * reduction scripts will ignore the "@" and the remainder of the line.26 */27TRACE_EVENT(rcu_utilization,28 29 TP_PROTO(const char *s),30 31 TP_ARGS(s),32 33 TP_STRUCT__entry(34 __field(const char *, s)35 ),36 37 TP_fast_assign(38 __entry->s = s;39 ),40 41 TP_printk("%s", __entry->s)42);43 44#if defined(CONFIG_TREE_RCU)45 46/*47 * Tracepoint for grace-period events. Takes a string identifying the48 * RCU flavor, the grace-period number, and a string identifying the49 * grace-period-related event as follows:50 *51 * "AccReadyCB": CPU accelerates new callbacks to RCU_NEXT_READY_TAIL.52 * "AccWaitCB": CPU accelerates new callbacks to RCU_WAIT_TAIL.53 * "newreq": Request a new grace period.54 * "start": Start a grace period.55 * "cpustart": CPU first notices a grace-period start.56 * "cpuqs": CPU passes through a quiescent state.57 * "cpuonl": CPU comes online.58 * "cpuofl": CPU goes offline.59 * "cpuofl-bgp": CPU goes offline while blocking a grace period.60 * "reqwait": GP kthread sleeps waiting for grace-period request.61 * "reqwaitsig": GP kthread awakened by signal from reqwait state.62 * "fqswait": GP kthread waiting until time to force quiescent states.63 * "fqsstart": GP kthread starts forcing quiescent states.64 * "fqsend": GP kthread done forcing quiescent states.65 * "fqswaitsig": GP kthread awakened by signal from fqswait state.66 * "end": End a grace period.67 * "cpuend": CPU first notices a grace-period end.68 */69TRACE_EVENT_RCU(rcu_grace_period,70 71 TP_PROTO(const char *rcuname, unsigned long gp_seq, const char *gpevent),72 73 TP_ARGS(rcuname, gp_seq, gpevent),74 75 TP_STRUCT__entry(76 __field(const char *, rcuname)77 __field(long, gp_seq)78 __field(const char *, gpevent)79 ),80 81 TP_fast_assign(82 __entry->rcuname = rcuname;83 __entry->gp_seq = (long)gp_seq;84 __entry->gpevent = gpevent;85 ),86 87 TP_printk("%s %ld %s",88 __entry->rcuname, __entry->gp_seq, __entry->gpevent)89);90 91/*92 * Tracepoint for future grace-period events. The caller should pull93 * the data from the rcu_node structure, other than rcuname, which comes94 * from the rcu_state structure, and event, which is one of the following:95 *96 * "Cleanup": Clean up rcu_node structure after previous GP.97 * "CleanupMore": Clean up, and another GP is needed.98 * "EndWait": Complete wait.99 * "NoGPkthread": The RCU grace-period kthread has not yet started.100 * "Prestarted": Someone beat us to the request101 * "Startedleaf": Leaf node marked for future GP.102 * "Startedleafroot": All nodes from leaf to root marked for future GP.103 * "Startedroot": Requested a nocb grace period based on root-node data.104 * "Startleaf": Request a grace period based on leaf-node data.105 * "StartWait": Start waiting for the requested grace period.106 */107TRACE_EVENT_RCU(rcu_future_grace_period,108 109 TP_PROTO(const char *rcuname, unsigned long gp_seq,110 unsigned long gp_seq_req, u8 level, int grplo, int grphi,111 const char *gpevent),112 113 TP_ARGS(rcuname, gp_seq, gp_seq_req, level, grplo, grphi, gpevent),114 115 TP_STRUCT__entry(116 __field(const char *, rcuname)117 __field(long, gp_seq)118 __field(long, gp_seq_req)119 __field(u8, level)120 __field(int, grplo)121 __field(int, grphi)122 __field(const char *, gpevent)123 ),124 125 TP_fast_assign(126 __entry->rcuname = rcuname;127 __entry->gp_seq = (long)gp_seq;128 __entry->gp_seq_req = (long)gp_seq_req;129 __entry->level = level;130 __entry->grplo = grplo;131 __entry->grphi = grphi;132 __entry->gpevent = gpevent;133 ),134 135 TP_printk("%s %ld %ld %u %d %d %s",136 __entry->rcuname, (long)__entry->gp_seq, (long)__entry->gp_seq_req, __entry->level,137 __entry->grplo, __entry->grphi, __entry->gpevent)138);139 140/*141 * Tracepoint for grace-period-initialization events. These are142 * distinguished by the type of RCU, the new grace-period number, the143 * rcu_node structure level, the starting and ending CPU covered by the144 * rcu_node structure, and the mask of CPUs that will be waited for.145 * All but the type of RCU are extracted from the rcu_node structure.146 */147TRACE_EVENT_RCU(rcu_grace_period_init,148 149 TP_PROTO(const char *rcuname, unsigned long gp_seq, u8 level,150 int grplo, int grphi, unsigned long qsmask),151 152 TP_ARGS(rcuname, gp_seq, level, grplo, grphi, qsmask),153 154 TP_STRUCT__entry(155 __field(const char *, rcuname)156 __field(long, gp_seq)157 __field(u8, level)158 __field(int, grplo)159 __field(int, grphi)160 __field(unsigned long, qsmask)161 ),162 163 TP_fast_assign(164 __entry->rcuname = rcuname;165 __entry->gp_seq = (long)gp_seq;166 __entry->level = level;167 __entry->grplo = grplo;168 __entry->grphi = grphi;169 __entry->qsmask = qsmask;170 ),171 172 TP_printk("%s %ld %u %d %d %lx",173 __entry->rcuname, __entry->gp_seq, __entry->level,174 __entry->grplo, __entry->grphi, __entry->qsmask)175);176 177/*178 * Tracepoint for expedited grace-period events. Takes a string identifying179 * the RCU flavor, the expedited grace-period sequence number, and a string180 * identifying the grace-period-related event as follows:181 *182 * "snap": Captured snapshot of expedited grace period sequence number.183 * "start": Started a real expedited grace period.184 * "reset": Started resetting the tree185 * "select": Started selecting the CPUs to wait on.186 * "selectofl": Selected CPU partially offline.187 * "startwait": Started waiting on selected CPUs.188 * "end": Ended a real expedited grace period.189 * "endwake": Woke piggybackers up.190 * "done": Someone else did the expedited grace period for us.191 */192TRACE_EVENT_RCU(rcu_exp_grace_period,193 194 TP_PROTO(const char *rcuname, unsigned long gpseq, const char *gpevent),195 196 TP_ARGS(rcuname, gpseq, gpevent),197 198 TP_STRUCT__entry(199 __field(const char *, rcuname)200 __field(long, gpseq)201 __field(const char *, gpevent)202 ),203 204 TP_fast_assign(205 __entry->rcuname = rcuname;206 __entry->gpseq = (long)gpseq;207 __entry->gpevent = gpevent;208 ),209 210 TP_printk("%s %ld %s",211 __entry->rcuname, __entry->gpseq, __entry->gpevent)212);213 214/*215 * Tracepoint for expedited grace-period funnel-locking events. Takes a216 * string identifying the RCU flavor, an integer identifying the rcu_node217 * combining-tree level, another pair of integers identifying the lowest-218 * and highest-numbered CPU associated with the current rcu_node structure,219 * and a string. identifying the grace-period-related event as follows:220 *221 * "nxtlvl": Advance to next level of rcu_node funnel222 * "wait": Wait for someone else to do expedited GP223 */224TRACE_EVENT_RCU(rcu_exp_funnel_lock,225 226 TP_PROTO(const char *rcuname, u8 level, int grplo, int grphi,227 const char *gpevent),228 229 TP_ARGS(rcuname, level, grplo, grphi, gpevent),230 231 TP_STRUCT__entry(232 __field(const char *, rcuname)233 __field(u8, level)234 __field(int, grplo)235 __field(int, grphi)236 __field(const char *, gpevent)237 ),238 239 TP_fast_assign(240 __entry->rcuname = rcuname;241 __entry->level = level;242 __entry->grplo = grplo;243 __entry->grphi = grphi;244 __entry->gpevent = gpevent;245 ),246 247 TP_printk("%s %d %d %d %s",248 __entry->rcuname, __entry->level, __entry->grplo,249 __entry->grphi, __entry->gpevent)250);251 252#ifdef CONFIG_RCU_NOCB_CPU253/*254 * Tracepoint for RCU no-CBs CPU callback handoffs. This event is intended255 * to assist debugging of these handoffs.256 *257 * The first argument is the name of the RCU flavor, and the second is258 * the number of the offloaded CPU are extracted. The third and final259 * argument is a string as follows:260 *261 * "AlreadyAwake": The to-be-awakened rcuo kthread is already awake.262 * "Bypass": rcuo GP kthread sees non-empty ->nocb_bypass.263 * "CBSleep": rcuo CB kthread sleeping waiting for CBs.264 * "Check": rcuo GP kthread checking specified CPU for work.265 * "DeferredWake": Timer expired or polled check, time to wake.266 * "DoWake": The to-be-awakened rcuo kthread needs to be awakened.267 * "EndSleep": Done waiting for GP for !rcu_nocb_poll.268 * "FirstBQ": New CB to empty ->nocb_bypass (->cblist maybe non-empty).269 * "FirstBQnoWake": FirstBQ plus rcuo kthread need not be awakened.270 * "FirstBQwake": FirstBQ plus rcuo kthread must be awakened.271 * "FirstQ": New CB to empty ->cblist (->nocb_bypass maybe non-empty).272 * "NeedWaitGP": rcuo GP kthread must wait on a grace period.273 * "Poll": Start of new polling cycle for rcu_nocb_poll.274 * "Sleep": Sleep waiting for GP for !rcu_nocb_poll.275 * "Timer": Deferred-wake timer expired.276 * "WakeEmptyIsDeferred": Wake rcuo kthread later, first CB to empty list.277 * "WakeEmpty": Wake rcuo kthread, first CB to empty list.278 * "WakeNot": Don't wake rcuo kthread.279 * "WakeNotPoll": Don't wake rcuo kthread because it is polling.280 * "WakeOvfIsDeferred": Wake rcuo kthread later, CB list is huge.281 * "WakeBypassIsDeferred": Wake rcuo kthread later, bypass list is contended.282 * "WokeEmpty": rcuo CB kthread woke to find empty list.283 */284TRACE_EVENT_RCU(rcu_nocb_wake,285 286 TP_PROTO(const char *rcuname, int cpu, const char *reason),287 288 TP_ARGS(rcuname, cpu, reason),289 290 TP_STRUCT__entry(291 __field(const char *, rcuname)292 __field(int, cpu)293 __field(const char *, reason)294 ),295 296 TP_fast_assign(297 __entry->rcuname = rcuname;298 __entry->cpu = cpu;299 __entry->reason = reason;300 ),301 302 TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason)303);304#endif305 306/*307 * Tracepoint for tasks blocking within preemptible-RCU read-side308 * critical sections. Track the type of RCU (which one day might309 * include SRCU), the grace-period number that the task is blocking310 * (the current or the next), and the task's PID.311 */312TRACE_EVENT_RCU(rcu_preempt_task,313 314 TP_PROTO(const char *rcuname, int pid, unsigned long gp_seq),315 316 TP_ARGS(rcuname, pid, gp_seq),317 318 TP_STRUCT__entry(319 __field(const char *, rcuname)320 __field(long, gp_seq)321 __field(int, pid)322 ),323 324 TP_fast_assign(325 __entry->rcuname = rcuname;326 __entry->gp_seq = (long)gp_seq;327 __entry->pid = pid;328 ),329 330 TP_printk("%s %ld %d",331 __entry->rcuname, __entry->gp_seq, __entry->pid)332);333 334/*335 * Tracepoint for tasks that blocked within a given preemptible-RCU336 * read-side critical section exiting that critical section. Track the337 * type of RCU (which one day might include SRCU) and the task's PID.338 */339TRACE_EVENT_RCU(rcu_unlock_preempted_task,340 341 TP_PROTO(const char *rcuname, unsigned long gp_seq, int pid),342 343 TP_ARGS(rcuname, gp_seq, pid),344 345 TP_STRUCT__entry(346 __field(const char *, rcuname)347 __field(long, gp_seq)348 __field(int, pid)349 ),350 351 TP_fast_assign(352 __entry->rcuname = rcuname;353 __entry->gp_seq = (long)gp_seq;354 __entry->pid = pid;355 ),356 357 TP_printk("%s %ld %d", __entry->rcuname, __entry->gp_seq, __entry->pid)358);359 360/*361 * Tracepoint for quiescent-state-reporting events. These are362 * distinguished by the type of RCU, the grace-period number, the363 * mask of quiescent lower-level entities, the rcu_node structure level,364 * the starting and ending CPU covered by the rcu_node structure, and365 * whether there are any blocked tasks blocking the current grace period.366 * All but the type of RCU are extracted from the rcu_node structure.367 */368TRACE_EVENT_RCU(rcu_quiescent_state_report,369 370 TP_PROTO(const char *rcuname, unsigned long gp_seq,371 unsigned long mask, unsigned long qsmask,372 u8 level, int grplo, int grphi, int gp_tasks),373 374 TP_ARGS(rcuname, gp_seq, mask, qsmask, level, grplo, grphi, gp_tasks),375 376 TP_STRUCT__entry(377 __field(const char *, rcuname)378 __field(long, gp_seq)379 __field(unsigned long, mask)380 __field(unsigned long, qsmask)381 __field(u8, level)382 __field(int, grplo)383 __field(int, grphi)384 __field(u8, gp_tasks)385 ),386 387 TP_fast_assign(388 __entry->rcuname = rcuname;389 __entry->gp_seq = (long)gp_seq;390 __entry->mask = mask;391 __entry->qsmask = qsmask;392 __entry->level = level;393 __entry->grplo = grplo;394 __entry->grphi = grphi;395 __entry->gp_tasks = gp_tasks;396 ),397 398 TP_printk("%s %ld %lx>%lx %u %d %d %u",399 __entry->rcuname, __entry->gp_seq,400 __entry->mask, __entry->qsmask, __entry->level,401 __entry->grplo, __entry->grphi, __entry->gp_tasks)402);403 404/*405 * Tracepoint for quiescent states detected by force_quiescent_state().406 * These trace events include the type of RCU, the grace-period number407 * that was blocked by the CPU, the CPU itself, and the type of quiescent408 * state, which can be "dti" for dyntick-idle mode or "kick" when kicking409 * a CPU that has been in dyntick-idle mode for too long.410 */411TRACE_EVENT_RCU(rcu_fqs,412 413 TP_PROTO(const char *rcuname, unsigned long gp_seq, int cpu, const char *qsevent),414 415 TP_ARGS(rcuname, gp_seq, cpu, qsevent),416 417 TP_STRUCT__entry(418 __field(const char *, rcuname)419 __field(long, gp_seq)420 __field(int, cpu)421 __field(const char *, qsevent)422 ),423 424 TP_fast_assign(425 __entry->rcuname = rcuname;426 __entry->gp_seq = (long)gp_seq;427 __entry->cpu = cpu;428 __entry->qsevent = qsevent;429 ),430 431 TP_printk("%s %ld %d %s",432 __entry->rcuname, __entry->gp_seq,433 __entry->cpu, __entry->qsevent)434);435 436/*437 * Tracepoint for RCU stall events. Takes a string identifying the RCU flavor438 * and a string identifying which function detected the RCU stall as follows:439 *440 * "StallDetected": Scheduler-tick detects other CPU's stalls.441 * "SelfDetected": Scheduler-tick detects a current CPU's stall.442 * "ExpeditedStall": Expedited grace period detects stalls.443 */444TRACE_EVENT(rcu_stall_warning,445 446 TP_PROTO(const char *rcuname, const char *msg),447 448 TP_ARGS(rcuname, msg),449 450 TP_STRUCT__entry(451 __field(const char *, rcuname)452 __field(const char *, msg)453 ),454 455 TP_fast_assign(456 __entry->rcuname = rcuname;457 __entry->msg = msg;458 ),459 460 TP_printk("%s %s",461 __entry->rcuname, __entry->msg)462);463 464#endif /* #if defined(CONFIG_TREE_RCU) */465 466/*467 * Tracepoint for dyntick-idle entry/exit events. These take 2 strings468 * as argument:469 * polarity: "Start", "End", "StillWatching" for entering, exiting or still not470 * being in EQS mode.471 * context: "USER" or "IDLE" or "IRQ".472 * NMIs nested in IRQs are inferred with nesting > 1 in IRQ context.473 *474 * These events also take a pair of numbers, which indicate the nesting475 * depth before and after the event of interest, and a third number that is476 * the RCU_WATCHING counter. Note that task-related and interrupt-related477 * events use two separate counters, and that the "++=" and "--=" events478 * for irq/NMI will change the counter by two, otherwise by one.479 */480TRACE_EVENT_RCU(rcu_watching,481 482 TP_PROTO(const char *polarity, long oldnesting, long newnesting, int counter),483 484 TP_ARGS(polarity, oldnesting, newnesting, counter),485 486 TP_STRUCT__entry(487 __field(const char *, polarity)488 __field(long, oldnesting)489 __field(long, newnesting)490 __field(int, counter)491 ),492 493 TP_fast_assign(494 __entry->polarity = polarity;495 __entry->oldnesting = oldnesting;496 __entry->newnesting = newnesting;497 __entry->counter = counter;498 ),499 500 TP_printk("%s %lx %lx %#3x", __entry->polarity,501 __entry->oldnesting, __entry->newnesting,502 __entry->counter & 0xfff)503);504 505/*506 * Tracepoint for the registration of a single RCU callback function.507 * The first argument is the type of RCU, the second argument is508 * a pointer to the RCU callback itself, the third element is the509 * number of lazy callbacks queued, and the fourth element is the510 * total number of callbacks queued.511 */512TRACE_EVENT_RCU(rcu_callback,513 514 TP_PROTO(const char *rcuname, struct rcu_head *rhp, long qlen),515 516 TP_ARGS(rcuname, rhp, qlen),517 518 TP_STRUCT__entry(519 __field(const char *, rcuname)520 __field(void *, rhp)521 __field(void *, func)522 __field(long, qlen)523 ),524 525 TP_fast_assign(526 __entry->rcuname = rcuname;527 __entry->rhp = rhp;528 __entry->func = rhp->func;529 __entry->qlen = qlen;530 ),531 532 TP_printk("%s rhp=%p func=%ps %ld",533 __entry->rcuname, __entry->rhp, __entry->func,534 __entry->qlen)535);536 537TRACE_EVENT_RCU(rcu_segcb_stats,538 539 TP_PROTO(struct rcu_segcblist *rs, const char *ctx),540 541 TP_ARGS(rs, ctx),542 543 TP_STRUCT__entry(544 __field(const char *, ctx)545 __array(unsigned long, gp_seq, RCU_CBLIST_NSEGS)546 __array(long, seglen, RCU_CBLIST_NSEGS)547 ),548 549 TP_fast_assign(550 __entry->ctx = ctx;551 memcpy(__entry->seglen, rs->seglen, RCU_CBLIST_NSEGS * sizeof(long));552 memcpy(__entry->gp_seq, rs->gp_seq, RCU_CBLIST_NSEGS * sizeof(unsigned long));553 554 ),555 556 TP_printk("%s seglen: (DONE=%ld, WAIT=%ld, NEXT_READY=%ld, NEXT=%ld) "557 "gp_seq: (DONE=%lu, WAIT=%lu, NEXT_READY=%lu, NEXT=%lu)", __entry->ctx,558 __entry->seglen[0], __entry->seglen[1], __entry->seglen[2], __entry->seglen[3],559 __entry->gp_seq[0], __entry->gp_seq[1], __entry->gp_seq[2], __entry->gp_seq[3])560 561);562 563/*564 * Tracepoint for the registration of a single RCU callback of the special565 * kvfree() form. The first argument is the RCU type, the second argument566 * is a pointer to the RCU callback, the third argument is the offset567 * of the callback within the enclosing RCU-protected data structure,568 * the fourth argument is the number of lazy callbacks queued, and the569 * fifth argument is the total number of callbacks queued.570 */571TRACE_EVENT_RCU(rcu_kvfree_callback,572 573 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset,574 long qlen),575 576 TP_ARGS(rcuname, rhp, offset, qlen),577 578 TP_STRUCT__entry(579 __field(const char *, rcuname)580 __field(void *, rhp)581 __field(unsigned long, offset)582 __field(long, qlen)583 ),584 585 TP_fast_assign(586 __entry->rcuname = rcuname;587 __entry->rhp = rhp;588 __entry->offset = offset;589 __entry->qlen = qlen;590 ),591 592 TP_printk("%s rhp=%p func=%ld %ld",593 __entry->rcuname, __entry->rhp, __entry->offset,594 __entry->qlen)595);596 597/*598 * Tracepoint for marking the beginning rcu_do_batch, performed to start599 * RCU callback invocation. The first argument is the RCU flavor,600 * the second is the number of lazy callbacks queued, the third is601 * the total number of callbacks queued, and the fourth argument is602 * the current RCU-callback batch limit.603 */604TRACE_EVENT_RCU(rcu_batch_start,605 606 TP_PROTO(const char *rcuname, long qlen, long blimit),607 608 TP_ARGS(rcuname, qlen, blimit),609 610 TP_STRUCT__entry(611 __field(const char *, rcuname)612 __field(long, qlen)613 __field(long, blimit)614 ),615 616 TP_fast_assign(617 __entry->rcuname = rcuname;618 __entry->qlen = qlen;619 __entry->blimit = blimit;620 ),621 622 TP_printk("%s CBs=%ld bl=%ld",623 __entry->rcuname, __entry->qlen, __entry->blimit)624);625 626/*627 * Tracepoint for the invocation of a single RCU callback function.628 * The first argument is the type of RCU, and the second argument is629 * a pointer to the RCU callback itself.630 */631TRACE_EVENT_RCU(rcu_invoke_callback,632 633 TP_PROTO(const char *rcuname, struct rcu_head *rhp),634 635 TP_ARGS(rcuname, rhp),636 637 TP_STRUCT__entry(638 __field(const char *, rcuname)639 __field(void *, rhp)640 __field(void *, func)641 ),642 643 TP_fast_assign(644 __entry->rcuname = rcuname;645 __entry->rhp = rhp;646 __entry->func = rhp->func;647 ),648 649 TP_printk("%s rhp=%p func=%ps",650 __entry->rcuname, __entry->rhp, __entry->func)651);652 653/*654 * Tracepoint for the invocation of a single RCU callback of the special655 * kvfree() form. The first argument is the RCU flavor, the second656 * argument is a pointer to the RCU callback, and the third argument657 * is the offset of the callback within the enclosing RCU-protected658 * data structure.659 */660TRACE_EVENT_RCU(rcu_invoke_kvfree_callback,661 662 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset),663 664 TP_ARGS(rcuname, rhp, offset),665 666 TP_STRUCT__entry(667 __field(const char *, rcuname)668 __field(void *, rhp)669 __field(unsigned long, offset)670 ),671 672 TP_fast_assign(673 __entry->rcuname = rcuname;674 __entry->rhp = rhp;675 __entry->offset = offset;676 ),677 678 TP_printk("%s rhp=%p func=%ld",679 __entry->rcuname, __entry->rhp, __entry->offset)680);681 682/*683 * Tracepoint for the invocation of a single RCU callback of the special684 * kfree_bulk() form. The first argument is the RCU flavor, the second685 * argument is a number of elements in array to free, the third is an686 * address of the array holding nr_records entries.687 */688TRACE_EVENT_RCU(rcu_invoke_kfree_bulk_callback,689 690 TP_PROTO(const char *rcuname, unsigned long nr_records, void **p),691 692 TP_ARGS(rcuname, nr_records, p),693 694 TP_STRUCT__entry(695 __field(const char *, rcuname)696 __field(unsigned long, nr_records)697 __field(void **, p)698 ),699 700 TP_fast_assign(701 __entry->rcuname = rcuname;702 __entry->nr_records = nr_records;703 __entry->p = p;704 ),705 706 TP_printk("%s bulk=0x%p nr_records=%lu",707 __entry->rcuname, __entry->p, __entry->nr_records)708);709 710/*711 * Tracepoint for a normal synchronize_rcu() states. The first argument712 * is the RCU flavor, the second argument is a pointer to rcu_head the713 * last one is an event.714 */715TRACE_EVENT_RCU(rcu_sr_normal,716 717 TP_PROTO(const char *rcuname, struct rcu_head *rhp, const char *srevent),718 719 TP_ARGS(rcuname, rhp, srevent),720 721 TP_STRUCT__entry(722 __field(const char *, rcuname)723 __field(void *, rhp)724 __field(const char *, srevent)725 ),726 727 TP_fast_assign(728 __entry->rcuname = rcuname;729 __entry->rhp = rhp;730 __entry->srevent = srevent;731 ),732 733 TP_printk("%s rhp=0x%p event=%s",734 __entry->rcuname, __entry->rhp, __entry->srevent)735);736 737/*738 * Tracepoint for exiting rcu_do_batch after RCU callbacks have been739 * invoked. The first argument is the name of the RCU flavor,740 * the second argument is number of callbacks actually invoked,741 * the third argument (cb) is whether or not any of the callbacks that742 * were ready to invoke at the beginning of this batch are still743 * queued, the fourth argument (nr) is the return value of need_resched(),744 * the fifth argument (iit) is 1 if the current task is the idle task,745 * and the sixth argument (risk) is the return value from746 * rcu_is_callbacks_kthread().747 */748TRACE_EVENT_RCU(rcu_batch_end,749 750 TP_PROTO(const char *rcuname, int callbacks_invoked,751 char cb, char nr, char iit, char risk),752 753 TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),754 755 TP_STRUCT__entry(756 __field(const char *, rcuname)757 __field(int, callbacks_invoked)758 __field(char, cb)759 __field(char, nr)760 __field(char, iit)761 __field(char, risk)762 ),763 764 TP_fast_assign(765 __entry->rcuname = rcuname;766 __entry->callbacks_invoked = callbacks_invoked;767 __entry->cb = cb;768 __entry->nr = nr;769 __entry->iit = iit;770 __entry->risk = risk;771 ),772 773 TP_printk("%s CBs-invoked=%d idle=%c%c%c%c",774 __entry->rcuname, __entry->callbacks_invoked,775 __entry->cb ? 'C' : '.',776 __entry->nr ? 'S' : '.',777 __entry->iit ? 'I' : '.',778 __entry->risk ? 'R' : '.')779);780 781/*782 * Tracepoint for rcutorture readers. The first argument is the name783 * of the RCU flavor from rcutorture's viewpoint and the second argument784 * is the callback address. The third argument is the start time in785 * seconds, and the last two arguments are the grace period numbers786 * at the beginning and end of the read, respectively. Note that the787 * callback address can be NULL.788 */789#define RCUTORTURENAME_LEN 8790TRACE_EVENT_RCU(rcu_torture_read,791 792 TP_PROTO(const char *rcutorturename, struct rcu_head *rhp,793 unsigned long secs, unsigned long c_old, unsigned long c),794 795 TP_ARGS(rcutorturename, rhp, secs, c_old, c),796 797 TP_STRUCT__entry(798 __array(char, rcutorturename, RCUTORTURENAME_LEN)799 __field(struct rcu_head *, rhp)800 __field(unsigned long, secs)801 __field(unsigned long, c_old)802 __field(unsigned long, c)803 ),804 805 TP_fast_assign(806 strscpy(__entry->rcutorturename, rcutorturename, RCUTORTURENAME_LEN);807 __entry->rhp = rhp;808 __entry->secs = secs;809 __entry->c_old = c_old;810 __entry->c = c;811 ),812 813 TP_printk("%s torture read %p %luus c: %lu %lu",814 __entry->rcutorturename, __entry->rhp,815 __entry->secs, __entry->c_old, __entry->c)816);817 818/*819 * Tracepoint for rcu_barrier() execution. The string "s" describes820 * the rcu_barrier phase:821 * "Begin": rcu_barrier() started.822 * "CB": An rcu_barrier_callback() invoked a callback, not the last.823 * "EarlyExit": rcu_barrier() piggybacked, thus early exit.824 * "Inc1": rcu_barrier() piggyback check counter incremented.825 * "Inc2": rcu_barrier() piggyback check counter incremented.826 * "IRQ": An rcu_barrier_callback() callback posted on remote CPU.827 * "IRQNQ": An rcu_barrier_callback() callback found no callbacks.828 * "LastCB": An rcu_barrier_callback() invoked the last callback.829 * "NQ": rcu_barrier() found a CPU with no callbacks.830 * "OnlineQ": rcu_barrier() found online CPU with callbacks.831 * The "cpu" argument is the CPU or -1 if meaningless, the "cnt" argument832 * is the count of remaining callbacks, and "done" is the piggybacking count.833 */834TRACE_EVENT_RCU(rcu_barrier,835 836 TP_PROTO(const char *rcuname, const char *s, int cpu, int cnt, unsigned long done),837 838 TP_ARGS(rcuname, s, cpu, cnt, done),839 840 TP_STRUCT__entry(841 __field(const char *, rcuname)842 __field(const char *, s)843 __field(int, cpu)844 __field(int, cnt)845 __field(unsigned long, done)846 ),847 848 TP_fast_assign(849 __entry->rcuname = rcuname;850 __entry->s = s;851 __entry->cpu = cpu;852 __entry->cnt = cnt;853 __entry->done = done;854 ),855 856 TP_printk("%s %s cpu %d remaining %d # %lu",857 __entry->rcuname, __entry->s, __entry->cpu, __entry->cnt,858 __entry->done)859);860 861#endif /* _TRACE_RCU_H */862 863/* This part must be outside protection */864#include <trace/define_trace.h>865