162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#undef TRACE_SYSTEM 362306a36Sopenharmony_ci#define TRACE_SYSTEM rcu 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ) 662306a36Sopenharmony_ci#define _TRACE_RCU_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/tracepoint.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifdef CONFIG_RCU_TRACE 1162306a36Sopenharmony_ci#define TRACE_EVENT_RCU TRACE_EVENT 1262306a36Sopenharmony_ci#else 1362306a36Sopenharmony_ci#define TRACE_EVENT_RCU TRACE_EVENT_NOP 1462306a36Sopenharmony_ci#endif 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * Tracepoint for start/end markers used for utilization calculations. 1862306a36Sopenharmony_ci * By convention, the string is of the following forms: 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * "Start <activity>" -- Mark the start of the specified activity, 2162306a36Sopenharmony_ci * such as "context switch". Nesting is permitted. 2262306a36Sopenharmony_ci * "End <activity>" -- Mark the end of the specified activity. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * An "@" character within "<activity>" is a comment character: Data 2562306a36Sopenharmony_ci * reduction scripts will ignore the "@" and the remainder of the line. 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ciTRACE_EVENT(rcu_utilization, 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci TP_PROTO(const char *s), 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci TP_ARGS(s), 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci TP_STRUCT__entry( 3462306a36Sopenharmony_ci __field(const char *, s) 3562306a36Sopenharmony_ci ), 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci TP_fast_assign( 3862306a36Sopenharmony_ci __entry->s = s; 3962306a36Sopenharmony_ci ), 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci TP_printk("%s", __entry->s) 4262306a36Sopenharmony_ci); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#if defined(CONFIG_TREE_RCU) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * Tracepoint for grace-period events. Takes a string identifying the 4862306a36Sopenharmony_ci * RCU flavor, the grace-period number, and a string identifying the 4962306a36Sopenharmony_ci * grace-period-related event as follows: 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * "AccReadyCB": CPU accelerates new callbacks to RCU_NEXT_READY_TAIL. 5262306a36Sopenharmony_ci * "AccWaitCB": CPU accelerates new callbacks to RCU_WAIT_TAIL. 5362306a36Sopenharmony_ci * "newreq": Request a new grace period. 5462306a36Sopenharmony_ci * "start": Start a grace period. 5562306a36Sopenharmony_ci * "cpustart": CPU first notices a grace-period start. 5662306a36Sopenharmony_ci * "cpuqs": CPU passes through a quiescent state. 5762306a36Sopenharmony_ci * "cpuonl": CPU comes online. 5862306a36Sopenharmony_ci * "cpuofl": CPU goes offline. 5962306a36Sopenharmony_ci * "cpuofl-bgp": CPU goes offline while blocking a grace period. 6062306a36Sopenharmony_ci * "reqwait": GP kthread sleeps waiting for grace-period request. 6162306a36Sopenharmony_ci * "reqwaitsig": GP kthread awakened by signal from reqwait state. 6262306a36Sopenharmony_ci * "fqswait": GP kthread waiting until time to force quiescent states. 6362306a36Sopenharmony_ci * "fqsstart": GP kthread starts forcing quiescent states. 6462306a36Sopenharmony_ci * "fqsend": GP kthread done forcing quiescent states. 6562306a36Sopenharmony_ci * "fqswaitsig": GP kthread awakened by signal from fqswait state. 6662306a36Sopenharmony_ci * "end": End a grace period. 6762306a36Sopenharmony_ci * "cpuend": CPU first notices a grace-period end. 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_grace_period, 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, const char *gpevent), 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, gpevent), 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci TP_STRUCT__entry( 7662306a36Sopenharmony_ci __field(const char *, rcuname) 7762306a36Sopenharmony_ci __field(long, gp_seq) 7862306a36Sopenharmony_ci __field(const char *, gpevent) 7962306a36Sopenharmony_ci ), 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci TP_fast_assign( 8262306a36Sopenharmony_ci __entry->rcuname = rcuname; 8362306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 8462306a36Sopenharmony_ci __entry->gpevent = gpevent; 8562306a36Sopenharmony_ci ), 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci TP_printk("%s %ld %s", 8862306a36Sopenharmony_ci __entry->rcuname, __entry->gp_seq, __entry->gpevent) 8962306a36Sopenharmony_ci); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* 9262306a36Sopenharmony_ci * Tracepoint for future grace-period events. The caller should pull 9362306a36Sopenharmony_ci * the data from the rcu_node structure, other than rcuname, which comes 9462306a36Sopenharmony_ci * from the rcu_state structure, and event, which is one of the following: 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * "Cleanup": Clean up rcu_node structure after previous GP. 9762306a36Sopenharmony_ci * "CleanupMore": Clean up, and another GP is needed. 9862306a36Sopenharmony_ci * "EndWait": Complete wait. 9962306a36Sopenharmony_ci * "NoGPkthread": The RCU grace-period kthread has not yet started. 10062306a36Sopenharmony_ci * "Prestarted": Someone beat us to the request 10162306a36Sopenharmony_ci * "Startedleaf": Leaf node marked for future GP. 10262306a36Sopenharmony_ci * "Startedleafroot": All nodes from leaf to root marked for future GP. 10362306a36Sopenharmony_ci * "Startedroot": Requested a nocb grace period based on root-node data. 10462306a36Sopenharmony_ci * "Startleaf": Request a grace period based on leaf-node data. 10562306a36Sopenharmony_ci * "StartWait": Start waiting for the requested grace period. 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_future_grace_period, 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, 11062306a36Sopenharmony_ci unsigned long gp_seq_req, u8 level, int grplo, int grphi, 11162306a36Sopenharmony_ci const char *gpevent), 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, gp_seq_req, level, grplo, grphi, gpevent), 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci TP_STRUCT__entry( 11662306a36Sopenharmony_ci __field(const char *, rcuname) 11762306a36Sopenharmony_ci __field(long, gp_seq) 11862306a36Sopenharmony_ci __field(long, gp_seq_req) 11962306a36Sopenharmony_ci __field(u8, level) 12062306a36Sopenharmony_ci __field(int, grplo) 12162306a36Sopenharmony_ci __field(int, grphi) 12262306a36Sopenharmony_ci __field(const char *, gpevent) 12362306a36Sopenharmony_ci ), 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci TP_fast_assign( 12662306a36Sopenharmony_ci __entry->rcuname = rcuname; 12762306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 12862306a36Sopenharmony_ci __entry->gp_seq_req = (long)gp_seq_req; 12962306a36Sopenharmony_ci __entry->level = level; 13062306a36Sopenharmony_ci __entry->grplo = grplo; 13162306a36Sopenharmony_ci __entry->grphi = grphi; 13262306a36Sopenharmony_ci __entry->gpevent = gpevent; 13362306a36Sopenharmony_ci ), 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci TP_printk("%s %ld %ld %u %d %d %s", 13662306a36Sopenharmony_ci __entry->rcuname, (long)__entry->gp_seq, (long)__entry->gp_seq_req, __entry->level, 13762306a36Sopenharmony_ci __entry->grplo, __entry->grphi, __entry->gpevent) 13862306a36Sopenharmony_ci); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* 14162306a36Sopenharmony_ci * Tracepoint for grace-period-initialization events. These are 14262306a36Sopenharmony_ci * distinguished by the type of RCU, the new grace-period number, the 14362306a36Sopenharmony_ci * rcu_node structure level, the starting and ending CPU covered by the 14462306a36Sopenharmony_ci * rcu_node structure, and the mask of CPUs that will be waited for. 14562306a36Sopenharmony_ci * All but the type of RCU are extracted from the rcu_node structure. 14662306a36Sopenharmony_ci */ 14762306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_grace_period_init, 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, u8 level, 15062306a36Sopenharmony_ci int grplo, int grphi, unsigned long qsmask), 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, level, grplo, grphi, qsmask), 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci TP_STRUCT__entry( 15562306a36Sopenharmony_ci __field(const char *, rcuname) 15662306a36Sopenharmony_ci __field(long, gp_seq) 15762306a36Sopenharmony_ci __field(u8, level) 15862306a36Sopenharmony_ci __field(int, grplo) 15962306a36Sopenharmony_ci __field(int, grphi) 16062306a36Sopenharmony_ci __field(unsigned long, qsmask) 16162306a36Sopenharmony_ci ), 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci TP_fast_assign( 16462306a36Sopenharmony_ci __entry->rcuname = rcuname; 16562306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 16662306a36Sopenharmony_ci __entry->level = level; 16762306a36Sopenharmony_ci __entry->grplo = grplo; 16862306a36Sopenharmony_ci __entry->grphi = grphi; 16962306a36Sopenharmony_ci __entry->qsmask = qsmask; 17062306a36Sopenharmony_ci ), 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci TP_printk("%s %ld %u %d %d %lx", 17362306a36Sopenharmony_ci __entry->rcuname, __entry->gp_seq, __entry->level, 17462306a36Sopenharmony_ci __entry->grplo, __entry->grphi, __entry->qsmask) 17562306a36Sopenharmony_ci); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* 17862306a36Sopenharmony_ci * Tracepoint for expedited grace-period events. Takes a string identifying 17962306a36Sopenharmony_ci * the RCU flavor, the expedited grace-period sequence number, and a string 18062306a36Sopenharmony_ci * identifying the grace-period-related event as follows: 18162306a36Sopenharmony_ci * 18262306a36Sopenharmony_ci * "snap": Captured snapshot of expedited grace period sequence number. 18362306a36Sopenharmony_ci * "start": Started a real expedited grace period. 18462306a36Sopenharmony_ci * "reset": Started resetting the tree 18562306a36Sopenharmony_ci * "select": Started selecting the CPUs to wait on. 18662306a36Sopenharmony_ci * "selectofl": Selected CPU partially offline. 18762306a36Sopenharmony_ci * "startwait": Started waiting on selected CPUs. 18862306a36Sopenharmony_ci * "end": Ended a real expedited grace period. 18962306a36Sopenharmony_ci * "endwake": Woke piggybackers up. 19062306a36Sopenharmony_ci * "done": Someone else did the expedited grace period for us. 19162306a36Sopenharmony_ci */ 19262306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_exp_grace_period, 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gpseq, const char *gpevent), 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci TP_ARGS(rcuname, gpseq, gpevent), 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci TP_STRUCT__entry( 19962306a36Sopenharmony_ci __field(const char *, rcuname) 20062306a36Sopenharmony_ci __field(long, gpseq) 20162306a36Sopenharmony_ci __field(const char *, gpevent) 20262306a36Sopenharmony_ci ), 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci TP_fast_assign( 20562306a36Sopenharmony_ci __entry->rcuname = rcuname; 20662306a36Sopenharmony_ci __entry->gpseq = (long)gpseq; 20762306a36Sopenharmony_ci __entry->gpevent = gpevent; 20862306a36Sopenharmony_ci ), 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci TP_printk("%s %ld %s", 21162306a36Sopenharmony_ci __entry->rcuname, __entry->gpseq, __entry->gpevent) 21262306a36Sopenharmony_ci); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci/* 21562306a36Sopenharmony_ci * Tracepoint for expedited grace-period funnel-locking events. Takes a 21662306a36Sopenharmony_ci * string identifying the RCU flavor, an integer identifying the rcu_node 21762306a36Sopenharmony_ci * combining-tree level, another pair of integers identifying the lowest- 21862306a36Sopenharmony_ci * and highest-numbered CPU associated with the current rcu_node structure, 21962306a36Sopenharmony_ci * and a string. identifying the grace-period-related event as follows: 22062306a36Sopenharmony_ci * 22162306a36Sopenharmony_ci * "nxtlvl": Advance to next level of rcu_node funnel 22262306a36Sopenharmony_ci * "wait": Wait for someone else to do expedited GP 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_exp_funnel_lock, 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci TP_PROTO(const char *rcuname, u8 level, int grplo, int grphi, 22762306a36Sopenharmony_ci const char *gpevent), 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci TP_ARGS(rcuname, level, grplo, grphi, gpevent), 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci TP_STRUCT__entry( 23262306a36Sopenharmony_ci __field(const char *, rcuname) 23362306a36Sopenharmony_ci __field(u8, level) 23462306a36Sopenharmony_ci __field(int, grplo) 23562306a36Sopenharmony_ci __field(int, grphi) 23662306a36Sopenharmony_ci __field(const char *, gpevent) 23762306a36Sopenharmony_ci ), 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci TP_fast_assign( 24062306a36Sopenharmony_ci __entry->rcuname = rcuname; 24162306a36Sopenharmony_ci __entry->level = level; 24262306a36Sopenharmony_ci __entry->grplo = grplo; 24362306a36Sopenharmony_ci __entry->grphi = grphi; 24462306a36Sopenharmony_ci __entry->gpevent = gpevent; 24562306a36Sopenharmony_ci ), 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci TP_printk("%s %d %d %d %s", 24862306a36Sopenharmony_ci __entry->rcuname, __entry->level, __entry->grplo, 24962306a36Sopenharmony_ci __entry->grphi, __entry->gpevent) 25062306a36Sopenharmony_ci); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci#ifdef CONFIG_RCU_NOCB_CPU 25362306a36Sopenharmony_ci/* 25462306a36Sopenharmony_ci * Tracepoint for RCU no-CBs CPU callback handoffs. This event is intended 25562306a36Sopenharmony_ci * to assist debugging of these handoffs. 25662306a36Sopenharmony_ci * 25762306a36Sopenharmony_ci * The first argument is the name of the RCU flavor, and the second is 25862306a36Sopenharmony_ci * the number of the offloaded CPU are extracted. The third and final 25962306a36Sopenharmony_ci * argument is a string as follows: 26062306a36Sopenharmony_ci * 26162306a36Sopenharmony_ci * "AlreadyAwake": The to-be-awakened rcuo kthread is already awake. 26262306a36Sopenharmony_ci * "Bypass": rcuo GP kthread sees non-empty ->nocb_bypass. 26362306a36Sopenharmony_ci * "CBSleep": rcuo CB kthread sleeping waiting for CBs. 26462306a36Sopenharmony_ci * "Check": rcuo GP kthread checking specified CPU for work. 26562306a36Sopenharmony_ci * "DeferredWake": Timer expired or polled check, time to wake. 26662306a36Sopenharmony_ci * "DoWake": The to-be-awakened rcuo kthread needs to be awakened. 26762306a36Sopenharmony_ci * "EndSleep": Done waiting for GP for !rcu_nocb_poll. 26862306a36Sopenharmony_ci * "FirstBQ": New CB to empty ->nocb_bypass (->cblist maybe non-empty). 26962306a36Sopenharmony_ci * "FirstBQnoWake": FirstBQ plus rcuo kthread need not be awakened. 27062306a36Sopenharmony_ci * "FirstBQwake": FirstBQ plus rcuo kthread must be awakened. 27162306a36Sopenharmony_ci * "FirstQ": New CB to empty ->cblist (->nocb_bypass maybe non-empty). 27262306a36Sopenharmony_ci * "NeedWaitGP": rcuo GP kthread must wait on a grace period. 27362306a36Sopenharmony_ci * "Poll": Start of new polling cycle for rcu_nocb_poll. 27462306a36Sopenharmony_ci * "Sleep": Sleep waiting for GP for !rcu_nocb_poll. 27562306a36Sopenharmony_ci * "Timer": Deferred-wake timer expired. 27662306a36Sopenharmony_ci * "WakeEmptyIsDeferred": Wake rcuo kthread later, first CB to empty list. 27762306a36Sopenharmony_ci * "WakeEmpty": Wake rcuo kthread, first CB to empty list. 27862306a36Sopenharmony_ci * "WakeNot": Don't wake rcuo kthread. 27962306a36Sopenharmony_ci * "WakeNotPoll": Don't wake rcuo kthread because it is polling. 28062306a36Sopenharmony_ci * "WakeOvfIsDeferred": Wake rcuo kthread later, CB list is huge. 28162306a36Sopenharmony_ci * "WakeBypassIsDeferred": Wake rcuo kthread later, bypass list is contended. 28262306a36Sopenharmony_ci * "WokeEmpty": rcuo CB kthread woke to find empty list. 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_nocb_wake, 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci TP_PROTO(const char *rcuname, int cpu, const char *reason), 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci TP_ARGS(rcuname, cpu, reason), 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci TP_STRUCT__entry( 29162306a36Sopenharmony_ci __field(const char *, rcuname) 29262306a36Sopenharmony_ci __field(int, cpu) 29362306a36Sopenharmony_ci __field(const char *, reason) 29462306a36Sopenharmony_ci ), 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci TP_fast_assign( 29762306a36Sopenharmony_ci __entry->rcuname = rcuname; 29862306a36Sopenharmony_ci __entry->cpu = cpu; 29962306a36Sopenharmony_ci __entry->reason = reason; 30062306a36Sopenharmony_ci ), 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason) 30362306a36Sopenharmony_ci); 30462306a36Sopenharmony_ci#endif 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/* 30762306a36Sopenharmony_ci * Tracepoint for tasks blocking within preemptible-RCU read-side 30862306a36Sopenharmony_ci * critical sections. Track the type of RCU (which one day might 30962306a36Sopenharmony_ci * include SRCU), the grace-period number that the task is blocking 31062306a36Sopenharmony_ci * (the current or the next), and the task's PID. 31162306a36Sopenharmony_ci */ 31262306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_preempt_task, 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci TP_PROTO(const char *rcuname, int pid, unsigned long gp_seq), 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci TP_ARGS(rcuname, pid, gp_seq), 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci TP_STRUCT__entry( 31962306a36Sopenharmony_ci __field(const char *, rcuname) 32062306a36Sopenharmony_ci __field(long, gp_seq) 32162306a36Sopenharmony_ci __field(int, pid) 32262306a36Sopenharmony_ci ), 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci TP_fast_assign( 32562306a36Sopenharmony_ci __entry->rcuname = rcuname; 32662306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 32762306a36Sopenharmony_ci __entry->pid = pid; 32862306a36Sopenharmony_ci ), 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci TP_printk("%s %ld %d", 33162306a36Sopenharmony_ci __entry->rcuname, __entry->gp_seq, __entry->pid) 33262306a36Sopenharmony_ci); 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci/* 33562306a36Sopenharmony_ci * Tracepoint for tasks that blocked within a given preemptible-RCU 33662306a36Sopenharmony_ci * read-side critical section exiting that critical section. Track the 33762306a36Sopenharmony_ci * type of RCU (which one day might include SRCU) and the task's PID. 33862306a36Sopenharmony_ci */ 33962306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_unlock_preempted_task, 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, int pid), 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, pid), 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci TP_STRUCT__entry( 34662306a36Sopenharmony_ci __field(const char *, rcuname) 34762306a36Sopenharmony_ci __field(long, gp_seq) 34862306a36Sopenharmony_ci __field(int, pid) 34962306a36Sopenharmony_ci ), 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci TP_fast_assign( 35262306a36Sopenharmony_ci __entry->rcuname = rcuname; 35362306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 35462306a36Sopenharmony_ci __entry->pid = pid; 35562306a36Sopenharmony_ci ), 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci TP_printk("%s %ld %d", __entry->rcuname, __entry->gp_seq, __entry->pid) 35862306a36Sopenharmony_ci); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* 36162306a36Sopenharmony_ci * Tracepoint for quiescent-state-reporting events. These are 36262306a36Sopenharmony_ci * distinguished by the type of RCU, the grace-period number, the 36362306a36Sopenharmony_ci * mask of quiescent lower-level entities, the rcu_node structure level, 36462306a36Sopenharmony_ci * the starting and ending CPU covered by the rcu_node structure, and 36562306a36Sopenharmony_ci * whether there are any blocked tasks blocking the current grace period. 36662306a36Sopenharmony_ci * All but the type of RCU are extracted from the rcu_node structure. 36762306a36Sopenharmony_ci */ 36862306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_quiescent_state_report, 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, 37162306a36Sopenharmony_ci unsigned long mask, unsigned long qsmask, 37262306a36Sopenharmony_ci u8 level, int grplo, int grphi, int gp_tasks), 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, mask, qsmask, level, grplo, grphi, gp_tasks), 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci TP_STRUCT__entry( 37762306a36Sopenharmony_ci __field(const char *, rcuname) 37862306a36Sopenharmony_ci __field(long, gp_seq) 37962306a36Sopenharmony_ci __field(unsigned long, mask) 38062306a36Sopenharmony_ci __field(unsigned long, qsmask) 38162306a36Sopenharmony_ci __field(u8, level) 38262306a36Sopenharmony_ci __field(int, grplo) 38362306a36Sopenharmony_ci __field(int, grphi) 38462306a36Sopenharmony_ci __field(u8, gp_tasks) 38562306a36Sopenharmony_ci ), 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci TP_fast_assign( 38862306a36Sopenharmony_ci __entry->rcuname = rcuname; 38962306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 39062306a36Sopenharmony_ci __entry->mask = mask; 39162306a36Sopenharmony_ci __entry->qsmask = qsmask; 39262306a36Sopenharmony_ci __entry->level = level; 39362306a36Sopenharmony_ci __entry->grplo = grplo; 39462306a36Sopenharmony_ci __entry->grphi = grphi; 39562306a36Sopenharmony_ci __entry->gp_tasks = gp_tasks; 39662306a36Sopenharmony_ci ), 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci TP_printk("%s %ld %lx>%lx %u %d %d %u", 39962306a36Sopenharmony_ci __entry->rcuname, __entry->gp_seq, 40062306a36Sopenharmony_ci __entry->mask, __entry->qsmask, __entry->level, 40162306a36Sopenharmony_ci __entry->grplo, __entry->grphi, __entry->gp_tasks) 40262306a36Sopenharmony_ci); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* 40562306a36Sopenharmony_ci * Tracepoint for quiescent states detected by force_quiescent_state(). 40662306a36Sopenharmony_ci * These trace events include the type of RCU, the grace-period number 40762306a36Sopenharmony_ci * that was blocked by the CPU, the CPU itself, and the type of quiescent 40862306a36Sopenharmony_ci * state, which can be "dti" for dyntick-idle mode or "kick" when kicking 40962306a36Sopenharmony_ci * a CPU that has been in dyntick-idle mode for too long. 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_fqs, 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long gp_seq, int cpu, const char *qsevent), 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci TP_ARGS(rcuname, gp_seq, cpu, qsevent), 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci TP_STRUCT__entry( 41862306a36Sopenharmony_ci __field(const char *, rcuname) 41962306a36Sopenharmony_ci __field(long, gp_seq) 42062306a36Sopenharmony_ci __field(int, cpu) 42162306a36Sopenharmony_ci __field(const char *, qsevent) 42262306a36Sopenharmony_ci ), 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci TP_fast_assign( 42562306a36Sopenharmony_ci __entry->rcuname = rcuname; 42662306a36Sopenharmony_ci __entry->gp_seq = (long)gp_seq; 42762306a36Sopenharmony_ci __entry->cpu = cpu; 42862306a36Sopenharmony_ci __entry->qsevent = qsevent; 42962306a36Sopenharmony_ci ), 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci TP_printk("%s %ld %d %s", 43262306a36Sopenharmony_ci __entry->rcuname, __entry->gp_seq, 43362306a36Sopenharmony_ci __entry->cpu, __entry->qsevent) 43462306a36Sopenharmony_ci); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci/* 43762306a36Sopenharmony_ci * Tracepoint for RCU stall events. Takes a string identifying the RCU flavor 43862306a36Sopenharmony_ci * and a string identifying which function detected the RCU stall as follows: 43962306a36Sopenharmony_ci * 44062306a36Sopenharmony_ci * "StallDetected": Scheduler-tick detects other CPU's stalls. 44162306a36Sopenharmony_ci * "SelfDetected": Scheduler-tick detects a current CPU's stall. 44262306a36Sopenharmony_ci * "ExpeditedStall": Expedited grace period detects stalls. 44362306a36Sopenharmony_ci */ 44462306a36Sopenharmony_ciTRACE_EVENT(rcu_stall_warning, 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci TP_PROTO(const char *rcuname, const char *msg), 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci TP_ARGS(rcuname, msg), 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci TP_STRUCT__entry( 45162306a36Sopenharmony_ci __field(const char *, rcuname) 45262306a36Sopenharmony_ci __field(const char *, msg) 45362306a36Sopenharmony_ci ), 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci TP_fast_assign( 45662306a36Sopenharmony_ci __entry->rcuname = rcuname; 45762306a36Sopenharmony_ci __entry->msg = msg; 45862306a36Sopenharmony_ci ), 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci TP_printk("%s %s", 46162306a36Sopenharmony_ci __entry->rcuname, __entry->msg) 46262306a36Sopenharmony_ci); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci#endif /* #if defined(CONFIG_TREE_RCU) */ 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci/* 46762306a36Sopenharmony_ci * Tracepoint for dyntick-idle entry/exit events. These take 2 strings 46862306a36Sopenharmony_ci * as argument: 46962306a36Sopenharmony_ci * polarity: "Start", "End", "StillNonIdle" for entering, exiting or still not 47062306a36Sopenharmony_ci * being in dyntick-idle mode. 47162306a36Sopenharmony_ci * context: "USER" or "IDLE" or "IRQ". 47262306a36Sopenharmony_ci * NMIs nested in IRQs are inferred with dynticks_nesting > 1 in IRQ context. 47362306a36Sopenharmony_ci * 47462306a36Sopenharmony_ci * These events also take a pair of numbers, which indicate the nesting 47562306a36Sopenharmony_ci * depth before and after the event of interest, and a third number that is 47662306a36Sopenharmony_ci * the ->dynticks counter. Note that task-related and interrupt-related 47762306a36Sopenharmony_ci * events use two separate counters, and that the "++=" and "--=" events 47862306a36Sopenharmony_ci * for irq/NMI will change the counter by two, otherwise by one. 47962306a36Sopenharmony_ci */ 48062306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_dyntick, 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci TP_PROTO(const char *polarity, long oldnesting, long newnesting, int dynticks), 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci TP_ARGS(polarity, oldnesting, newnesting, dynticks), 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci TP_STRUCT__entry( 48762306a36Sopenharmony_ci __field(const char *, polarity) 48862306a36Sopenharmony_ci __field(long, oldnesting) 48962306a36Sopenharmony_ci __field(long, newnesting) 49062306a36Sopenharmony_ci __field(int, dynticks) 49162306a36Sopenharmony_ci ), 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci TP_fast_assign( 49462306a36Sopenharmony_ci __entry->polarity = polarity; 49562306a36Sopenharmony_ci __entry->oldnesting = oldnesting; 49662306a36Sopenharmony_ci __entry->newnesting = newnesting; 49762306a36Sopenharmony_ci __entry->dynticks = dynticks; 49862306a36Sopenharmony_ci ), 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci TP_printk("%s %lx %lx %#3x", __entry->polarity, 50162306a36Sopenharmony_ci __entry->oldnesting, __entry->newnesting, 50262306a36Sopenharmony_ci __entry->dynticks & 0xfff) 50362306a36Sopenharmony_ci); 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci/* 50662306a36Sopenharmony_ci * Tracepoint for the registration of a single RCU callback function. 50762306a36Sopenharmony_ci * The first argument is the type of RCU, the second argument is 50862306a36Sopenharmony_ci * a pointer to the RCU callback itself, the third element is the 50962306a36Sopenharmony_ci * number of lazy callbacks queued, and the fourth element is the 51062306a36Sopenharmony_ci * total number of callbacks queued. 51162306a36Sopenharmony_ci */ 51262306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_callback, 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci TP_PROTO(const char *rcuname, struct rcu_head *rhp, long qlen), 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci TP_ARGS(rcuname, rhp, qlen), 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci TP_STRUCT__entry( 51962306a36Sopenharmony_ci __field(const char *, rcuname) 52062306a36Sopenharmony_ci __field(void *, rhp) 52162306a36Sopenharmony_ci __field(void *, func) 52262306a36Sopenharmony_ci __field(long, qlen) 52362306a36Sopenharmony_ci ), 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci TP_fast_assign( 52662306a36Sopenharmony_ci __entry->rcuname = rcuname; 52762306a36Sopenharmony_ci __entry->rhp = rhp; 52862306a36Sopenharmony_ci __entry->func = rhp->func; 52962306a36Sopenharmony_ci __entry->qlen = qlen; 53062306a36Sopenharmony_ci ), 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci TP_printk("%s rhp=%p func=%ps %ld", 53362306a36Sopenharmony_ci __entry->rcuname, __entry->rhp, __entry->func, 53462306a36Sopenharmony_ci __entry->qlen) 53562306a36Sopenharmony_ci); 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_segcb_stats, 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci TP_PROTO(struct rcu_segcblist *rs, const char *ctx), 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci TP_ARGS(rs, ctx), 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci TP_STRUCT__entry( 54462306a36Sopenharmony_ci __field(const char *, ctx) 54562306a36Sopenharmony_ci __array(unsigned long, gp_seq, RCU_CBLIST_NSEGS) 54662306a36Sopenharmony_ci __array(long, seglen, RCU_CBLIST_NSEGS) 54762306a36Sopenharmony_ci ), 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci TP_fast_assign( 55062306a36Sopenharmony_ci __entry->ctx = ctx; 55162306a36Sopenharmony_ci memcpy(__entry->seglen, rs->seglen, RCU_CBLIST_NSEGS * sizeof(long)); 55262306a36Sopenharmony_ci memcpy(__entry->gp_seq, rs->gp_seq, RCU_CBLIST_NSEGS * sizeof(unsigned long)); 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci ), 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci TP_printk("%s seglen: (DONE=%ld, WAIT=%ld, NEXT_READY=%ld, NEXT=%ld) " 55762306a36Sopenharmony_ci "gp_seq: (DONE=%lu, WAIT=%lu, NEXT_READY=%lu, NEXT=%lu)", __entry->ctx, 55862306a36Sopenharmony_ci __entry->seglen[0], __entry->seglen[1], __entry->seglen[2], __entry->seglen[3], 55962306a36Sopenharmony_ci __entry->gp_seq[0], __entry->gp_seq[1], __entry->gp_seq[2], __entry->gp_seq[3]) 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci); 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci/* 56462306a36Sopenharmony_ci * Tracepoint for the registration of a single RCU callback of the special 56562306a36Sopenharmony_ci * kvfree() form. The first argument is the RCU type, the second argument 56662306a36Sopenharmony_ci * is a pointer to the RCU callback, the third argument is the offset 56762306a36Sopenharmony_ci * of the callback within the enclosing RCU-protected data structure, 56862306a36Sopenharmony_ci * the fourth argument is the number of lazy callbacks queued, and the 56962306a36Sopenharmony_ci * fifth argument is the total number of callbacks queued. 57062306a36Sopenharmony_ci */ 57162306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_kvfree_callback, 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset, 57462306a36Sopenharmony_ci long qlen), 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci TP_ARGS(rcuname, rhp, offset, qlen), 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci TP_STRUCT__entry( 57962306a36Sopenharmony_ci __field(const char *, rcuname) 58062306a36Sopenharmony_ci __field(void *, rhp) 58162306a36Sopenharmony_ci __field(unsigned long, offset) 58262306a36Sopenharmony_ci __field(long, qlen) 58362306a36Sopenharmony_ci ), 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci TP_fast_assign( 58662306a36Sopenharmony_ci __entry->rcuname = rcuname; 58762306a36Sopenharmony_ci __entry->rhp = rhp; 58862306a36Sopenharmony_ci __entry->offset = offset; 58962306a36Sopenharmony_ci __entry->qlen = qlen; 59062306a36Sopenharmony_ci ), 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci TP_printk("%s rhp=%p func=%ld %ld", 59362306a36Sopenharmony_ci __entry->rcuname, __entry->rhp, __entry->offset, 59462306a36Sopenharmony_ci __entry->qlen) 59562306a36Sopenharmony_ci); 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci/* 59862306a36Sopenharmony_ci * Tracepoint for marking the beginning rcu_do_batch, performed to start 59962306a36Sopenharmony_ci * RCU callback invocation. The first argument is the RCU flavor, 60062306a36Sopenharmony_ci * the second is the number of lazy callbacks queued, the third is 60162306a36Sopenharmony_ci * the total number of callbacks queued, and the fourth argument is 60262306a36Sopenharmony_ci * the current RCU-callback batch limit. 60362306a36Sopenharmony_ci */ 60462306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_batch_start, 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci TP_PROTO(const char *rcuname, long qlen, long blimit), 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci TP_ARGS(rcuname, qlen, blimit), 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci TP_STRUCT__entry( 61162306a36Sopenharmony_ci __field(const char *, rcuname) 61262306a36Sopenharmony_ci __field(long, qlen) 61362306a36Sopenharmony_ci __field(long, blimit) 61462306a36Sopenharmony_ci ), 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci TP_fast_assign( 61762306a36Sopenharmony_ci __entry->rcuname = rcuname; 61862306a36Sopenharmony_ci __entry->qlen = qlen; 61962306a36Sopenharmony_ci __entry->blimit = blimit; 62062306a36Sopenharmony_ci ), 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci TP_printk("%s CBs=%ld bl=%ld", 62362306a36Sopenharmony_ci __entry->rcuname, __entry->qlen, __entry->blimit) 62462306a36Sopenharmony_ci); 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci/* 62762306a36Sopenharmony_ci * Tracepoint for the invocation of a single RCU callback function. 62862306a36Sopenharmony_ci * The first argument is the type of RCU, and the second argument is 62962306a36Sopenharmony_ci * a pointer to the RCU callback itself. 63062306a36Sopenharmony_ci */ 63162306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_invoke_callback, 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci TP_PROTO(const char *rcuname, struct rcu_head *rhp), 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci TP_ARGS(rcuname, rhp), 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci TP_STRUCT__entry( 63862306a36Sopenharmony_ci __field(const char *, rcuname) 63962306a36Sopenharmony_ci __field(void *, rhp) 64062306a36Sopenharmony_ci __field(void *, func) 64162306a36Sopenharmony_ci ), 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci TP_fast_assign( 64462306a36Sopenharmony_ci __entry->rcuname = rcuname; 64562306a36Sopenharmony_ci __entry->rhp = rhp; 64662306a36Sopenharmony_ci __entry->func = rhp->func; 64762306a36Sopenharmony_ci ), 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci TP_printk("%s rhp=%p func=%ps", 65062306a36Sopenharmony_ci __entry->rcuname, __entry->rhp, __entry->func) 65162306a36Sopenharmony_ci); 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci/* 65462306a36Sopenharmony_ci * Tracepoint for the invocation of a single RCU callback of the special 65562306a36Sopenharmony_ci * kvfree() form. The first argument is the RCU flavor, the second 65662306a36Sopenharmony_ci * argument is a pointer to the RCU callback, and the third argument 65762306a36Sopenharmony_ci * is the offset of the callback within the enclosing RCU-protected 65862306a36Sopenharmony_ci * data structure. 65962306a36Sopenharmony_ci */ 66062306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_invoke_kvfree_callback, 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset), 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci TP_ARGS(rcuname, rhp, offset), 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci TP_STRUCT__entry( 66762306a36Sopenharmony_ci __field(const char *, rcuname) 66862306a36Sopenharmony_ci __field(void *, rhp) 66962306a36Sopenharmony_ci __field(unsigned long, offset) 67062306a36Sopenharmony_ci ), 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci TP_fast_assign( 67362306a36Sopenharmony_ci __entry->rcuname = rcuname; 67462306a36Sopenharmony_ci __entry->rhp = rhp; 67562306a36Sopenharmony_ci __entry->offset = offset; 67662306a36Sopenharmony_ci ), 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci TP_printk("%s rhp=%p func=%ld", 67962306a36Sopenharmony_ci __entry->rcuname, __entry->rhp, __entry->offset) 68062306a36Sopenharmony_ci); 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci/* 68362306a36Sopenharmony_ci * Tracepoint for the invocation of a single RCU callback of the special 68462306a36Sopenharmony_ci * kfree_bulk() form. The first argument is the RCU flavor, the second 68562306a36Sopenharmony_ci * argument is a number of elements in array to free, the third is an 68662306a36Sopenharmony_ci * address of the array holding nr_records entries. 68762306a36Sopenharmony_ci */ 68862306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_invoke_kfree_bulk_callback, 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci TP_PROTO(const char *rcuname, unsigned long nr_records, void **p), 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci TP_ARGS(rcuname, nr_records, p), 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci TP_STRUCT__entry( 69562306a36Sopenharmony_ci __field(const char *, rcuname) 69662306a36Sopenharmony_ci __field(unsigned long, nr_records) 69762306a36Sopenharmony_ci __field(void **, p) 69862306a36Sopenharmony_ci ), 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci TP_fast_assign( 70162306a36Sopenharmony_ci __entry->rcuname = rcuname; 70262306a36Sopenharmony_ci __entry->nr_records = nr_records; 70362306a36Sopenharmony_ci __entry->p = p; 70462306a36Sopenharmony_ci ), 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci TP_printk("%s bulk=0x%p nr_records=%lu", 70762306a36Sopenharmony_ci __entry->rcuname, __entry->p, __entry->nr_records) 70862306a36Sopenharmony_ci); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci/* 71162306a36Sopenharmony_ci * Tracepoint for exiting rcu_do_batch after RCU callbacks have been 71262306a36Sopenharmony_ci * invoked. The first argument is the name of the RCU flavor, 71362306a36Sopenharmony_ci * the second argument is number of callbacks actually invoked, 71462306a36Sopenharmony_ci * the third argument (cb) is whether or not any of the callbacks that 71562306a36Sopenharmony_ci * were ready to invoke at the beginning of this batch are still 71662306a36Sopenharmony_ci * queued, the fourth argument (nr) is the return value of need_resched(), 71762306a36Sopenharmony_ci * the fifth argument (iit) is 1 if the current task is the idle task, 71862306a36Sopenharmony_ci * and the sixth argument (risk) is the return value from 71962306a36Sopenharmony_ci * rcu_is_callbacks_kthread(). 72062306a36Sopenharmony_ci */ 72162306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_batch_end, 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci TP_PROTO(const char *rcuname, int callbacks_invoked, 72462306a36Sopenharmony_ci char cb, char nr, char iit, char risk), 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk), 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci TP_STRUCT__entry( 72962306a36Sopenharmony_ci __field(const char *, rcuname) 73062306a36Sopenharmony_ci __field(int, callbacks_invoked) 73162306a36Sopenharmony_ci __field(char, cb) 73262306a36Sopenharmony_ci __field(char, nr) 73362306a36Sopenharmony_ci __field(char, iit) 73462306a36Sopenharmony_ci __field(char, risk) 73562306a36Sopenharmony_ci ), 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci TP_fast_assign( 73862306a36Sopenharmony_ci __entry->rcuname = rcuname; 73962306a36Sopenharmony_ci __entry->callbacks_invoked = callbacks_invoked; 74062306a36Sopenharmony_ci __entry->cb = cb; 74162306a36Sopenharmony_ci __entry->nr = nr; 74262306a36Sopenharmony_ci __entry->iit = iit; 74362306a36Sopenharmony_ci __entry->risk = risk; 74462306a36Sopenharmony_ci ), 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci TP_printk("%s CBs-invoked=%d idle=%c%c%c%c", 74762306a36Sopenharmony_ci __entry->rcuname, __entry->callbacks_invoked, 74862306a36Sopenharmony_ci __entry->cb ? 'C' : '.', 74962306a36Sopenharmony_ci __entry->nr ? 'S' : '.', 75062306a36Sopenharmony_ci __entry->iit ? 'I' : '.', 75162306a36Sopenharmony_ci __entry->risk ? 'R' : '.') 75262306a36Sopenharmony_ci); 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci/* 75562306a36Sopenharmony_ci * Tracepoint for rcutorture readers. The first argument is the name 75662306a36Sopenharmony_ci * of the RCU flavor from rcutorture's viewpoint and the second argument 75762306a36Sopenharmony_ci * is the callback address. The third argument is the start time in 75862306a36Sopenharmony_ci * seconds, and the last two arguments are the grace period numbers 75962306a36Sopenharmony_ci * at the beginning and end of the read, respectively. Note that the 76062306a36Sopenharmony_ci * callback address can be NULL. 76162306a36Sopenharmony_ci */ 76262306a36Sopenharmony_ci#define RCUTORTURENAME_LEN 8 76362306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_torture_read, 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci TP_PROTO(const char *rcutorturename, struct rcu_head *rhp, 76662306a36Sopenharmony_ci unsigned long secs, unsigned long c_old, unsigned long c), 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci TP_ARGS(rcutorturename, rhp, secs, c_old, c), 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci TP_STRUCT__entry( 77162306a36Sopenharmony_ci __array(char, rcutorturename, RCUTORTURENAME_LEN) 77262306a36Sopenharmony_ci __field(struct rcu_head *, rhp) 77362306a36Sopenharmony_ci __field(unsigned long, secs) 77462306a36Sopenharmony_ci __field(unsigned long, c_old) 77562306a36Sopenharmony_ci __field(unsigned long, c) 77662306a36Sopenharmony_ci ), 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci TP_fast_assign( 77962306a36Sopenharmony_ci strscpy(__entry->rcutorturename, rcutorturename, RCUTORTURENAME_LEN); 78062306a36Sopenharmony_ci __entry->rhp = rhp; 78162306a36Sopenharmony_ci __entry->secs = secs; 78262306a36Sopenharmony_ci __entry->c_old = c_old; 78362306a36Sopenharmony_ci __entry->c = c; 78462306a36Sopenharmony_ci ), 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_ci TP_printk("%s torture read %p %luus c: %lu %lu", 78762306a36Sopenharmony_ci __entry->rcutorturename, __entry->rhp, 78862306a36Sopenharmony_ci __entry->secs, __entry->c_old, __entry->c) 78962306a36Sopenharmony_ci); 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci/* 79262306a36Sopenharmony_ci * Tracepoint for rcu_barrier() execution. The string "s" describes 79362306a36Sopenharmony_ci * the rcu_barrier phase: 79462306a36Sopenharmony_ci * "Begin": rcu_barrier() started. 79562306a36Sopenharmony_ci * "CB": An rcu_barrier_callback() invoked a callback, not the last. 79662306a36Sopenharmony_ci * "EarlyExit": rcu_barrier() piggybacked, thus early exit. 79762306a36Sopenharmony_ci * "Inc1": rcu_barrier() piggyback check counter incremented. 79862306a36Sopenharmony_ci * "Inc2": rcu_barrier() piggyback check counter incremented. 79962306a36Sopenharmony_ci * "IRQ": An rcu_barrier_callback() callback posted on remote CPU. 80062306a36Sopenharmony_ci * "IRQNQ": An rcu_barrier_callback() callback found no callbacks. 80162306a36Sopenharmony_ci * "LastCB": An rcu_barrier_callback() invoked the last callback. 80262306a36Sopenharmony_ci * "NQ": rcu_barrier() found a CPU with no callbacks. 80362306a36Sopenharmony_ci * "OnlineQ": rcu_barrier() found online CPU with callbacks. 80462306a36Sopenharmony_ci * The "cpu" argument is the CPU or -1 if meaningless, the "cnt" argument 80562306a36Sopenharmony_ci * is the count of remaining callbacks, and "done" is the piggybacking count. 80662306a36Sopenharmony_ci */ 80762306a36Sopenharmony_ciTRACE_EVENT_RCU(rcu_barrier, 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci TP_PROTO(const char *rcuname, const char *s, int cpu, int cnt, unsigned long done), 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci TP_ARGS(rcuname, s, cpu, cnt, done), 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci TP_STRUCT__entry( 81462306a36Sopenharmony_ci __field(const char *, rcuname) 81562306a36Sopenharmony_ci __field(const char *, s) 81662306a36Sopenharmony_ci __field(int, cpu) 81762306a36Sopenharmony_ci __field(int, cnt) 81862306a36Sopenharmony_ci __field(unsigned long, done) 81962306a36Sopenharmony_ci ), 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci TP_fast_assign( 82262306a36Sopenharmony_ci __entry->rcuname = rcuname; 82362306a36Sopenharmony_ci __entry->s = s; 82462306a36Sopenharmony_ci __entry->cpu = cpu; 82562306a36Sopenharmony_ci __entry->cnt = cnt; 82662306a36Sopenharmony_ci __entry->done = done; 82762306a36Sopenharmony_ci ), 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci TP_printk("%s %s cpu %d remaining %d # %lu", 83062306a36Sopenharmony_ci __entry->rcuname, __entry->s, __entry->cpu, __entry->cnt, 83162306a36Sopenharmony_ci __entry->done) 83262306a36Sopenharmony_ci); 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci#endif /* _TRACE_RCU_H */ 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci/* This part must be outside protection */ 83762306a36Sopenharmony_ci#include <trace/define_trace.h> 838