]> git.karo-electronics.de Git - linux-beck.git/commitdiff
rcu: Add tracing of normal (non-NOCB) grace-period requests
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 9 Aug 2013 23:02:09 +0000 (16:02 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 23 Sep 2013 16:18:08 +0000 (09:18 -0700)
This commit adds tracing to the normal grace-period request points.
These are rcu_gp_cleanup(), which checks for the need for another
grace period at the end of the previous grace period, and
rcu_start_gp_advanced(), which restarts RCU's state machine after
an idle period.  These trace events are intended to help track down
bugs where RCU remains idle despite there being work for it to do.

Reported-by: Clark Williams <williams@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
include/trace/events/rcu.h
kernel/rcutree.c

index 60077e12093cc5056b054e0653d8573052f538e2..98466c618ebc229a214cc34d4425efbeb73e667f 100644 (file)
@@ -45,6 +45,7 @@ TRACE_EVENT(rcu_utilization,
  *
  *     "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.
index 78d3715266679c033e762abf2d7c08ba8731b37c..54dd6d03dbb5d496531935807d0f7a6ad7500939 100644 (file)
@@ -1459,8 +1459,12 @@ static void rcu_gp_cleanup(struct rcu_state *rsp)
        rsp->fqs_state = RCU_GP_IDLE;
        rdp = this_cpu_ptr(rsp->rda);
        rcu_advance_cbs(rsp, rnp, rdp);  /* Reduce false positives below. */
-       if (cpu_needs_another_gp(rsp, rdp))
+       if (cpu_needs_another_gp(rsp, rdp)) {
                rsp->gp_flags = 1;
+               trace_rcu_grace_period(rsp->name,
+                                      ACCESS_ONCE(rsp->gpnum),
+                                      TPS("newreq"));
+       }
        raw_spin_unlock_irq(&rnp->lock);
 }
 
@@ -1584,6 +1588,8 @@ rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp,
                return;
        }
        rsp->gp_flags = RCU_GP_FLAG_INIT;
+       trace_rcu_grace_period(rsp->name, ACCESS_ONCE(rsp->gpnum),
+                              TPS("newreq"));
 
        /*
         * We can't do wakeups while holding the rnp->lock, as that