rcu: Track rcu_nocb_kthread()'s sleeping and awakening
[platform/adaptation/renesas_rcar/renesas_kernel.git] / include / trace / events / rcu.h
index 59ebcc8..a087d82 100644 (file)
  */
 TRACE_EVENT(rcu_utilization,
 
-       TP_PROTO(char *s),
+       TP_PROTO(const char *s),
 
        TP_ARGS(s),
 
        TP_STRUCT__entry(
-               __field(char *, s)
+               __field(const char *, s)
        ),
 
        TP_fast_assign(
@@ -39,26 +39,37 @@ TRACE_EVENT(rcu_utilization,
 #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU)
 
 /*
- * Tracepoint for grace-period events: starting and ending a grace
- * period ("start" and "end", respectively), a CPU noting the start
- * of a new grace period or the end of an old grace period ("cpustart"
- * and "cpuend", respectively), a CPU passing through a quiescent
- * state ("cpuqs"), a CPU coming online or going offline ("cpuonl"
- * and "cpuofl", respectively), a CPU being kicked for being too
- * long in dyntick-idle mode ("kick"), a CPU accelerating its new
- * callbacks to RCU_NEXT_READY_TAIL ("AccReadyCB"), and a CPU
- * accelerating its new callbacks to RCU_WAIT_TAIL ("AccWaitCB").
+ * Tracepoint for grace-period events.  Takes a string identifying the
+ * RCU flavor, the grace-period number, and a string identifying the
+ * grace-period-related event as follows:
+ *
+ *     "AccReadyCB": CPU acclerates new callbacks to RCU_NEXT_READY_TAIL.
+ *     "AccWaitCB": CPU accelerates new callbacks to RCU_WAIT_TAIL.
+ *     "newreq": Request a new grace period.
+ *     "start": Start a grace period.
+ *     "cpustart": CPU first notices a grace-period start.
+ *     "cpuqs": CPU passes through a quiescent state.
+ *     "cpuonl": CPU comes online.
+ *     "cpuofl": CPU goes offline.
+ *     "reqwait": GP kthread sleeps waiting for grace-period request.
+ *     "reqwaitsig": GP kthread awakened by signal from reqwait state.
+ *     "fqswait": GP kthread waiting until time to force quiescent states.
+ *     "fqsstart": GP kthread starts forcing quiescent states.
+ *     "fqsend": GP kthread done forcing quiescent states.
+ *     "fqswaitsig": GP kthread awakened by signal from fqswait state.
+ *     "end": End a grace period.
+ *     "cpuend": CPU first notices a grace-period end.
  */
 TRACE_EVENT(rcu_grace_period,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum, char *gpevent),
+       TP_PROTO(const char *rcuname, unsigned long gpnum, const char *gpevent),
 
        TP_ARGS(rcuname, gpnum, gpevent),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
-               __field(char *, gpevent)
+               __field(const char *, gpevent)
        ),
 
        TP_fast_assign(
@@ -89,21 +100,21 @@ TRACE_EVENT(rcu_grace_period,
  */
 TRACE_EVENT(rcu_future_grace_period,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum, unsigned long completed,
+       TP_PROTO(const char *rcuname, unsigned long gpnum, unsigned long completed,
                 unsigned long c, u8 level, int grplo, int grphi,
-                char *gpevent),
+                const char *gpevent),
 
        TP_ARGS(rcuname, gpnum, completed, c, level, grplo, grphi, gpevent),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(unsigned long, completed)
                __field(unsigned long, c)
                __field(u8, level)
                __field(int, grplo)
                __field(int, grphi)
-               __field(char *, gpevent)
+               __field(const char *, gpevent)
        ),
 
        TP_fast_assign(
@@ -132,13 +143,13 @@ TRACE_EVENT(rcu_future_grace_period,
  */
 TRACE_EVENT(rcu_grace_period_init,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum, u8 level,
+       TP_PROTO(const char *rcuname, unsigned long gpnum, u8 level,
                 int grplo, int grphi, unsigned long qsmask),
 
        TP_ARGS(rcuname, gpnum, level, grplo, grphi, qsmask),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(u8, level)
                __field(int, grplo)
@@ -161,6 +172,46 @@ TRACE_EVENT(rcu_grace_period_init,
 );
 
 /*
+ * Tracepoint for RCU no-CBs CPU callback handoffs.  This event is intended
+ * to assist debugging of these handoffs.
+ *
+ * The first argument is the name of the RCU flavor, and the second is
+ * the number of the offloaded CPU are extracted.  The third and final
+ * argument is a string as follows:
+ *
+ *     "WakeEmpty": Wake rcuo kthread, first CB to empty list.
+ *     "WakeOvf": Wake rcuo kthread, CB list is huge.
+ *     "WakeNot": Don't wake rcuo kthread.
+ *     "WakeNotPoll": Don't wake rcuo kthread because it is polling.
+ *     "Poll": Start of new polling cycle for rcu_nocb_poll.
+ *     "Sleep": Sleep waiting for CBs for !rcu_nocb_poll.
+ *     "WokeEmpty": rcuo kthread woke to find empty list.
+ *     "WokeNonEmpty": rcuo kthread woke to find non-empty list.
+ *     "WaitQueue": Enqueue partially done, timed wait for it to complete.
+ *     "WokeQueue": Partial enqueue now complete.
+ */
+TRACE_EVENT(rcu_nocb_wake,
+
+       TP_PROTO(const char *rcuname, int cpu, const char *reason),
+
+       TP_ARGS(rcuname, cpu, reason),
+
+       TP_STRUCT__entry(
+               __field(const char *, rcuname)
+               __field(int, cpu)
+               __field(const char *, reason)
+       ),
+
+       TP_fast_assign(
+               __entry->rcuname = rcuname;
+               __entry->cpu = cpu;
+               __entry->reason = reason;
+       ),
+
+       TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason)
+);
+
+/*
  * Tracepoint for tasks blocking within preemptible-RCU read-side
  * critical sections.  Track the type of RCU (which one day might
  * include SRCU), the grace-period number that the task is blocking
@@ -168,12 +219,12 @@ TRACE_EVENT(rcu_grace_period_init,
  */
 TRACE_EVENT(rcu_preempt_task,
 
-       TP_PROTO(char *rcuname, int pid, unsigned long gpnum),
+       TP_PROTO(const char *rcuname, int pid, unsigned long gpnum),
 
        TP_ARGS(rcuname, pid, gpnum),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(int, pid)
        ),
@@ -195,12 +246,12 @@ TRACE_EVENT(rcu_preempt_task,
  */
 TRACE_EVENT(rcu_unlock_preempted_task,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum, int pid),
+       TP_PROTO(const char *rcuname, unsigned long gpnum, int pid),
 
        TP_ARGS(rcuname, gpnum, pid),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(int, pid)
        ),
@@ -224,14 +275,14 @@ TRACE_EVENT(rcu_unlock_preempted_task,
  */
 TRACE_EVENT(rcu_quiescent_state_report,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum,
+       TP_PROTO(const char *rcuname, unsigned long gpnum,
                 unsigned long mask, unsigned long qsmask,
                 u8 level, int grplo, int grphi, int gp_tasks),
 
        TP_ARGS(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(unsigned long, mask)
                __field(unsigned long, qsmask)
@@ -268,15 +319,15 @@ TRACE_EVENT(rcu_quiescent_state_report,
  */
 TRACE_EVENT(rcu_fqs,
 
-       TP_PROTO(char *rcuname, unsigned long gpnum, int cpu, char *qsevent),
+       TP_PROTO(const char *rcuname, unsigned long gpnum, int cpu, const char *qsevent),
 
        TP_ARGS(rcuname, gpnum, cpu, qsevent),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(unsigned long, gpnum)
                __field(int, cpu)
-               __field(char *, qsevent)
+               __field(const char *, qsevent)
        ),
 
        TP_fast_assign(
@@ -308,12 +359,12 @@ TRACE_EVENT(rcu_fqs,
  */
 TRACE_EVENT(rcu_dyntick,
 
-       TP_PROTO(char *polarity, long long oldnesting, long long newnesting),
+       TP_PROTO(const char *polarity, long long oldnesting, long long newnesting),
 
        TP_ARGS(polarity, oldnesting, newnesting),
 
        TP_STRUCT__entry(
-               __field(char *, polarity)
+               __field(const char *, polarity)
                __field(long long, oldnesting)
                __field(long long, newnesting)
        ),
@@ -352,12 +403,12 @@ TRACE_EVENT(rcu_dyntick,
  */
 TRACE_EVENT(rcu_prep_idle,
 
-       TP_PROTO(char *reason),
+       TP_PROTO(const char *reason),
 
        TP_ARGS(reason),
 
        TP_STRUCT__entry(
-               __field(char *, reason)
+               __field(const char *, reason)
        ),
 
        TP_fast_assign(
@@ -376,13 +427,13 @@ TRACE_EVENT(rcu_prep_idle,
  */
 TRACE_EVENT(rcu_callback,
 
-       TP_PROTO(char *rcuname, struct rcu_head *rhp, long qlen_lazy,
+       TP_PROTO(const char *rcuname, struct rcu_head *rhp, long qlen_lazy,
                 long qlen),
 
        TP_ARGS(rcuname, rhp, qlen_lazy, qlen),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(void *, rhp)
                __field(void *, func)
                __field(long, qlen_lazy)
@@ -412,13 +463,13 @@ TRACE_EVENT(rcu_callback,
  */
 TRACE_EVENT(rcu_kfree_callback,
 
-       TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset,
+       TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset,
                 long qlen_lazy, long qlen),
 
        TP_ARGS(rcuname, rhp, offset, qlen_lazy, qlen),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(void *, rhp)
                __field(unsigned long, offset)
                __field(long, qlen_lazy)
@@ -447,12 +498,12 @@ TRACE_EVENT(rcu_kfree_callback,
  */
 TRACE_EVENT(rcu_batch_start,
 
-       TP_PROTO(char *rcuname, long qlen_lazy, long qlen, long blimit),
+       TP_PROTO(const char *rcuname, long qlen_lazy, long qlen, long blimit),
 
        TP_ARGS(rcuname, qlen_lazy, qlen, blimit),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(long, qlen_lazy)
                __field(long, qlen)
                __field(long, blimit)
@@ -477,12 +528,12 @@ TRACE_EVENT(rcu_batch_start,
  */
 TRACE_EVENT(rcu_invoke_callback,
 
-       TP_PROTO(char *rcuname, struct rcu_head *rhp),
+       TP_PROTO(const char *rcuname, struct rcu_head *rhp),
 
        TP_ARGS(rcuname, rhp),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(void *, rhp)
                __field(void *, func)
        ),
@@ -506,12 +557,12 @@ TRACE_EVENT(rcu_invoke_callback,
  */
 TRACE_EVENT(rcu_invoke_kfree_callback,
 
-       TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset),
+       TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset),
 
        TP_ARGS(rcuname, rhp, offset),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(void *, rhp)
                __field(unsigned long, offset)
        ),
@@ -539,13 +590,13 @@ TRACE_EVENT(rcu_invoke_kfree_callback,
  */
 TRACE_EVENT(rcu_batch_end,
 
-       TP_PROTO(char *rcuname, int callbacks_invoked,
+       TP_PROTO(const char *rcuname, int callbacks_invoked,
                 bool cb, bool nr, bool iit, bool risk),
 
        TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
+               __field(const char *, rcuname)
                __field(int, callbacks_invoked)
                __field(bool, cb)
                __field(bool, nr)
@@ -577,13 +628,13 @@ TRACE_EVENT(rcu_batch_end,
  */
 TRACE_EVENT(rcu_torture_read,
 
-       TP_PROTO(char *rcutorturename, struct rcu_head *rhp,
+       TP_PROTO(const char *rcutorturename, struct rcu_head *rhp,
                 unsigned long secs, unsigned long c_old, unsigned long c),
 
        TP_ARGS(rcutorturename, rhp, secs, c_old, c),
 
        TP_STRUCT__entry(
-               __field(char *, rcutorturename)
+               __field(const char *, rcutorturename)
                __field(struct rcu_head *, rhp)
                __field(unsigned long, secs)
                __field(unsigned long, c_old)
@@ -623,13 +674,13 @@ TRACE_EVENT(rcu_torture_read,
  */
 TRACE_EVENT(rcu_barrier,
 
-       TP_PROTO(char *rcuname, char *s, int cpu, int cnt, unsigned long done),
+       TP_PROTO(const char *rcuname, const char *s, int cpu, int cnt, unsigned long done),
 
        TP_ARGS(rcuname, s, cpu, cnt, done),
 
        TP_STRUCT__entry(
-               __field(char *, rcuname)
-               __field(char *, s)
+               __field(const char *, rcuname)
+               __field(const char *, s)
                __field(int, cpu)
                __field(int, cnt)
                __field(unsigned long, done)
@@ -656,6 +707,7 @@ TRACE_EVENT(rcu_barrier,
 #define trace_rcu_future_grace_period(rcuname, gpnum, completed, c, \
                                      level, grplo, grphi, event) \
                                      do { } while (0)
+#define trace_rcu_nocb_wake(rcuname, cpu, reason) do { } while (0)
 #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0)
 #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0)
 #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, \