mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	cpu/hotplug: Provide dynamic range for prepare stage
Mathieu reported that the LTTNG modules are broken as of 4.10-rc1 due to the removal of the cpu hotplug notifiers. Usually I don't care much about out of tree modules, but LTTNG is widely used in distros. There are two ways to solve that: 1) Reserve a hotplug state for LTTNG 2) Add a dynamic range for the prepare states. While #1 is the simplest solution, #2 is the proper one as we can convert in tree users, which do not care about ordering, to the dynamic range as well. Add a dynamic range which allows LTTNG to request states in the prepare stage. Reported-and-tested-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Sewior <bigeasy@linutronix.de> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1701101353010.3401@nanos Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									7e164ce4e8
								
							
						
					
					
						commit
						4205e4786d
					
				
					 2 changed files with 20 additions and 4 deletions
				
			
		|  | @ -74,6 +74,8 @@ enum cpuhp_state { | ||||||
| 	CPUHP_ZCOMP_PREPARE, | 	CPUHP_ZCOMP_PREPARE, | ||||||
| 	CPUHP_TIMERS_DEAD, | 	CPUHP_TIMERS_DEAD, | ||||||
| 	CPUHP_MIPS_SOC_PREPARE, | 	CPUHP_MIPS_SOC_PREPARE, | ||||||
|  | 	CPUHP_BP_PREPARE_DYN, | ||||||
|  | 	CPUHP_BP_PREPARE_DYN_END		= CPUHP_BP_PREPARE_DYN + 20, | ||||||
| 	CPUHP_BRINGUP_CPU, | 	CPUHP_BRINGUP_CPU, | ||||||
| 	CPUHP_AP_IDLE_DEAD, | 	CPUHP_AP_IDLE_DEAD, | ||||||
| 	CPUHP_AP_OFFLINE, | 	CPUHP_AP_OFFLINE, | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								kernel/cpu.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								kernel/cpu.c
									
									
									
									
									
								
							|  | @ -1302,10 +1302,24 @@ static int cpuhp_cb_check(enum cpuhp_state state) | ||||||
|  */ |  */ | ||||||
| static int cpuhp_reserve_state(enum cpuhp_state state) | static int cpuhp_reserve_state(enum cpuhp_state state) | ||||||
| { | { | ||||||
| 	enum cpuhp_state i; | 	enum cpuhp_state i, end; | ||||||
|  | 	struct cpuhp_step *step; | ||||||
| 
 | 
 | ||||||
| 	for (i = CPUHP_AP_ONLINE_DYN; i <= CPUHP_AP_ONLINE_DYN_END; i++) { | 	switch (state) { | ||||||
| 		if (!cpuhp_ap_states[i].name) | 	case CPUHP_AP_ONLINE_DYN: | ||||||
|  | 		step = cpuhp_ap_states + CPUHP_AP_ONLINE_DYN; | ||||||
|  | 		end = CPUHP_AP_ONLINE_DYN_END; | ||||||
|  | 		break; | ||||||
|  | 	case CPUHP_BP_PREPARE_DYN: | ||||||
|  | 		step = cpuhp_bp_states + CPUHP_BP_PREPARE_DYN; | ||||||
|  | 		end = CPUHP_BP_PREPARE_DYN_END; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (i = state; i <= end; i++, step++) { | ||||||
|  | 		if (!step->name) | ||||||
| 			return i; | 			return i; | ||||||
| 	} | 	} | ||||||
| 	WARN(1, "No more dynamic states available for CPU hotplug\n"); | 	WARN(1, "No more dynamic states available for CPU hotplug\n"); | ||||||
|  | @ -1323,7 +1337,7 @@ static int cpuhp_store_callbacks(enum cpuhp_state state, const char *name, | ||||||
| 
 | 
 | ||||||
| 	mutex_lock(&cpuhp_state_mutex); | 	mutex_lock(&cpuhp_state_mutex); | ||||||
| 
 | 
 | ||||||
| 	if (state == CPUHP_AP_ONLINE_DYN) { | 	if (state == CPUHP_AP_ONLINE_DYN || state == CPUHP_BP_PREPARE_DYN) { | ||||||
| 		ret = cpuhp_reserve_state(state); | 		ret = cpuhp_reserve_state(state); | ||||||
| 		if (ret < 0) | 		if (ret < 0) | ||||||
| 			goto out; | 			goto out; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Thomas Gleixner
						Thomas Gleixner