Commit 0e985e9d authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

cpuidle: Add comments about noinstr/__cpuidle usage



Add a few words on noinstr / __cpuidle usage.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20230112195542.397238052@infradead.org
parent 26388a7c
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -252,6 +252,18 @@ noinstr int cpuidle_enter_state(struct cpuidle_device *dev,
		instrumentation_begin();
	}

	/*
	 * NOTE!!
	 *
	 * For cpuidle_state::enter() methods that do *NOT* set
	 * CPUIDLE_FLAG_RCU_IDLE RCU will be disabled here and these functions
	 * must be marked either noinstr or __cpuidle.
	 *
	 * For cpuidle_state::enter() methods that *DO* set
	 * CPUIDLE_FLAG_RCU_IDLE this isn't required, but they must mark the
	 * function calling ct_cpuidle_enter() as noinstr/__cpuidle and all
	 * functions called within the RCU-idle region.
	 */
	entered_state = target_state->enter(dev, drv, index);

	if (WARN_ONCE(!irqs_disabled(), "%ps leaked IRQ state", target_state->enter))
+10 −0
Original line number Diff line number Diff line
@@ -239,6 +239,16 @@ struct ftrace_likely_data {

#define noinstr __noinstr_section(".noinstr.text")

/*
 * The __cpuidle section is used twofold:
 *
 *  1) the original use -- identifying if a CPU is 'stuck' in idle state based
 *     on it's instruction pointer. See cpu_in_idle().
 *
 *  2) supressing instrumentation around where cpuidle disables RCU; where the
 *     function isn't strictly required for #1, this is interchangeable with
 *     noinstr.
 */
#define __cpuidle __noinstr_section(".cpuidle.text")

#endif /* __KERNEL__ */