diff options
Diffstat (limited to 'drivers/acpi/processor_throttling.c')
| -rw-r--r-- | drivers/acpi/processor_throttling.c | 24 | 
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c index ff3632717c5..ffc859c6139 100644 --- a/drivers/acpi/processor_throttling.c +++ b/drivers/acpi/processor_throttling.c @@ -876,7 +876,11 @@ static int acpi_processor_get_throttling(struct acpi_processor *pr)  	 */  	cpumask_copy(saved_mask, ¤t->cpus_allowed);  	/* FIXME: use work_on_cpu() */ -	set_cpus_allowed_ptr(current, cpumask_of(pr->id)); +	if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) { +		/* Can't migrate to the target pr->id CPU. Exit */ +		free_cpumask_var(saved_mask); +		return -ENODEV; +	}  	ret = pr->throttling.acpi_processor_get_throttling(pr);  	/* restore the previous state */  	set_cpus_allowed_ptr(current, saved_mask); @@ -1051,6 +1055,14 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,  		return -ENOMEM;  	} +	if (cpu_is_offline(pr->id)) { +		/* +		 * the cpu pointed by pr->id is offline. Unnecessary to change +		 * the throttling state any more. +		 */ +		return -ENODEV; +	} +  	cpumask_copy(saved_mask, ¤t->cpus_allowed);  	t_state.target_state = state;  	p_throttling = &(pr->throttling); @@ -1074,7 +1086,11 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,  	 */  	if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) {  		/* FIXME: use work_on_cpu() */ -		set_cpus_allowed_ptr(current, cpumask_of(pr->id)); +		if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) { +			/* Can't migrate to the pr->id CPU. Exit */ +			ret = -ENODEV; +			goto exit; +		}  		ret = p_throttling->acpi_processor_set_throttling(pr,  						t_state.target_state, force);  	} else { @@ -1106,7 +1122,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,  			}  			t_state.cpu = i;  			/* FIXME: use work_on_cpu() */ -			set_cpus_allowed_ptr(current, cpumask_of(i)); +			if (set_cpus_allowed_ptr(current, cpumask_of(i))) +				continue;  			ret = match_pr->throttling.  				acpi_processor_set_throttling(  				match_pr, t_state.target_state, force); @@ -1126,6 +1143,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,  	/* restore the previous state */  	/* FIXME: use work_on_cpu() */  	set_cpus_allowed_ptr(current, saved_mask); +exit:  	free_cpumask_var(online_throttling_cpus);  	free_cpumask_var(saved_mask);  	return ret;  |