rcu: Add tracing to irq/NMI dyntick-idle transitions
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 4 Oct 2017 19:29:01 +0000 (12:29 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 28 Nov 2017 23:51:18 +0000 (15:51 -0800)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
include/trace/events/rcu.h
kernel/rcu/tree.c

index 59d40c4..4674b21 100644 (file)
@@ -421,16 +421,18 @@ TRACE_EVENT(rcu_fqs,
 
 /*
  * Tracepoint for dyntick-idle entry/exit events.  These take a string
- * as argument: "Start" for entering dyntick-idle mode, "End" for
- * leaving it, "--=" for events moving towards idle, and "++=" for events
- * moving away from idle.  "Error on entry: not idle task" and "Error on
- * exit: not idle task" indicate that a non-idle task is erroneously
+ * as argument: "Start" for entering dyntick-idle mode, "Startirq" for
+ * entering it from irq/NMI, "End" for leaving it, "Endirq" for leaving it
+ * to irq/NMI, "--=" for events moving towards idle, and "++=" for events
+ * moving away from idle.  "Error on entry: not idle task" and "Error
+ * on exit: not idle task" indicate that a non-idle task is erroneously
  * toying with the idle loop.
  *
  * These events also take a pair of numbers, which indicate the nesting
  * depth before and after the event of interest.  Note that task-related
- * events use the upper bits of each number, while interrupt-related
- * events use the lower bits.
+ * and interrupt-related events use two separate counters, and that the
+ * "++=" and "--=" events for irq/NMI will change the counter by two,
+ * otherwise by one.
  */
 TRACE_EVENT(rcu_dyntick,
 
index 444aa2b..d069ba2 100644 (file)
@@ -880,12 +880,15 @@ void rcu_nmi_exit(void)
         * leave it in non-RCU-idle state.
         */
        if (rdtp->dynticks_nmi_nesting != 1) {
+               trace_rcu_dyntick(TPS("--="), rdtp->dynticks_nmi_nesting,
+                                 rdtp->dynticks_nmi_nesting - 2);
                WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* No store tearing. */
                           rdtp->dynticks_nmi_nesting - 2);
                return;
        }
 
        /* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */
+       trace_rcu_dyntick(TPS("Startirq"), rdtp->dynticks_nmi_nesting, 0);
        WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */
        rcu_dynticks_eqs_enter();
 }
@@ -1057,6 +1060,9 @@ void rcu_nmi_enter(void)
                rcu_dynticks_eqs_exit();
                incby = 1;
        }
+       trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="),
+                         rdtp->dynticks_nmi_nesting,
+                         rdtp->dynticks_nmi_nesting + incby);
        WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* Prevent store tearing. */
                   rdtp->dynticks_nmi_nesting + incby);
        barrier();