/*
  * Tracepoint for rcutorture readers.  The first argument is the name
  * of the RCU flavor from rcutorture's viewpoint and the second argument
- * is the callback address.
+ * is the callback address.  The third argument is the start time in
+ * seconds, and the last two arguments are the grace period numbers
+ * at the beginning and end of the read, respectively.  Note that the
+ * callback address can be NULL.
  */
 TRACE_EVENT(rcu_torture_read,
 
 
 
 static void rcu_read_delay(struct torture_random_state *rrsp)
 {
+       unsigned long started;
+       unsigned long completed;
        const unsigned long shortdelay_us = 200;
        const unsigned long longdelay_ms = 50;
+       unsigned long long ts;
 
        /* We want a short delay sometimes to make a reader delay the grace
         * period, and we want a long delay occasionally to trigger
         * force_quiescent_state. */
 
-       if (!(torture_random(rrsp) % (nrealreaders * 2000 * longdelay_ms)))
+       if (!(torture_random(rrsp) % (nrealreaders * 2000 * longdelay_ms))) {
+               started = cur_ops->completed();
+               ts = rcu_trace_clock_local();
                mdelay(longdelay_ms);
+               completed = cur_ops->completed();
+               do_trace_rcu_torture_read(cur_ops->name, NULL, ts,
+                                         started, completed);
+       }
        if (!(torture_random(rrsp) % (nrealreaders * 2 * shortdelay_us)))
                udelay(shortdelay_us);
 #ifdef CONFIG_PREEMPT