forked from mirrors/linux
		
	cpuidle: Add comments about noinstr/__cpuidle usage
Add a few words on noinstr / __cpuidle usage. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230112195542.397238052@infradead.org
This commit is contained in:
		
							parent
							
								
									26388a7c35
								
							
						
					
					
						commit
						0e985e9d22
					
				
					 2 changed files with 22 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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__ */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue