Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd2b879a authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: Add tracing to irq/NMI dyntick-idle transitions

parent 844ccdd7
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -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,

+6 −0
Original line number Diff line number Diff line
@@ -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();