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