diff options
Diffstat (limited to 'kernel/cpu.c')
| -rw-r--r-- | kernel/cpu.c | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/kernel/cpu.c b/kernel/cpu.c index f75c4d031eeb..c47506357519 100644 --- a/kernel/cpu.c +++ b/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)  { -	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++) { -		if (!cpuhp_ap_states[i].name) +	switch (state) { +	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;  	}  	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); -	if (state == CPUHP_AP_ONLINE_DYN) { +	if (state == CPUHP_AP_ONLINE_DYN || state == CPUHP_BP_PREPARE_DYN) {  		ret = cpuhp_reserve_state(state);  		if (ret < 0)  			goto out;  | 
