cpufreq: governors: Reset tunables only for cpufreq_unregister_governor()
Currently, whenever governor->governor() is called for CPUFRREQ_GOV_START event we reset few tunables of governor. Which isn't correct, as this routine is called for every cpu hot-[un]plugging event. We should actually be resetting these only when the governor module is removed and re-installed. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
					parent
					
						
							
								4447266b84
							
						
					
				
			
			
				commit
				
					
						b394058f06
					
				
			
		
					 3 changed files with 21 additions and 8 deletions
				
			
		|  | @ -1562,6 +1562,9 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, | |||
| 						policy->cpu, event); | ||||
| 	ret = policy->governor->governor(policy, event); | ||||
| 
 | ||||
| 	if (!policy->governor->initialized && (event == CPUFREQ_GOV_START)) | ||||
| 		policy->governor->initialized = 1; | ||||
| 
 | ||||
| 	/* we keep one module reference alive for
 | ||||
| 			each CPU governed by this CPU */ | ||||
| 	if ((event != CPUFREQ_GOV_START) || ret) | ||||
|  | @ -1585,6 +1588,7 @@ int cpufreq_register_governor(struct cpufreq_governor *governor) | |||
| 
 | ||||
| 	mutex_lock(&cpufreq_governor_mutex); | ||||
| 
 | ||||
| 	governor->initialized = 0; | ||||
| 	err = -EBUSY; | ||||
| 	if (__find_governor(governor->name) == NULL) { | ||||
| 		err = 0; | ||||
|  |  | |||
|  | @ -254,11 +254,6 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data, | |||
| 			return rc; | ||||
| 		} | ||||
| 
 | ||||
| 		/* policy latency is in nS. Convert it to uS first */ | ||||
| 		latency = policy->cpuinfo.transition_latency / 1000; | ||||
| 		if (latency == 0) | ||||
| 			latency = 1; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * conservative does not implement micro like ondemand | ||||
| 		 * governor, thus we are bound to jiffes/HZ | ||||
|  | @ -270,20 +265,33 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data, | |||
| 			cpufreq_register_notifier(cs_ops->notifier_block, | ||||
| 					CPUFREQ_TRANSITION_NOTIFIER); | ||||
| 
 | ||||
| 			dbs_data->min_sampling_rate = MIN_SAMPLING_RATE_RATIO * | ||||
| 				jiffies_to_usecs(10); | ||||
| 			if (!policy->governor->initialized) | ||||
| 				dbs_data->min_sampling_rate = | ||||
| 					MIN_SAMPLING_RATE_RATIO * | ||||
| 					jiffies_to_usecs(10); | ||||
| 		} else { | ||||
| 			od_dbs_info->rate_mult = 1; | ||||
| 			od_dbs_info->sample_type = OD_NORMAL_SAMPLE; | ||||
| 			od_ops->powersave_bias_init_cpu(cpu); | ||||
| 			od_tuners->io_is_busy = od_ops->io_busy(); | ||||
| 
 | ||||
| 			if (!policy->governor->initialized) | ||||
| 				od_tuners->io_is_busy = od_ops->io_busy(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (policy->governor->initialized) | ||||
| 			goto unlock; | ||||
| 
 | ||||
| 		/* policy latency is in nS. Convert it to uS first */ | ||||
| 		latency = policy->cpuinfo.transition_latency / 1000; | ||||
| 		if (latency == 0) | ||||
| 			latency = 1; | ||||
| 
 | ||||
| 		/* Bring kernel and HW constraints together */ | ||||
| 		dbs_data->min_sampling_rate = max(dbs_data->min_sampling_rate, | ||||
| 				MIN_LATENCY_MULTIPLIER * latency); | ||||
| 		*sampling_rate = max(dbs_data->min_sampling_rate, latency * | ||||
| 				LATENCY_MULTIPLIER); | ||||
| unlock: | ||||
| 		mutex_unlock(&dbs_data->mutex); | ||||
| 
 | ||||
| 		/* Initiate timer time stamp */ | ||||
|  |  | |||
|  | @ -183,6 +183,7 @@ static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mu | |||
| 
 | ||||
| struct cpufreq_governor { | ||||
| 	char	name[CPUFREQ_NAME_LEN]; | ||||
| 	int	initialized; | ||||
| 	int	(*governor)	(struct cpufreq_policy *policy, | ||||
| 				 unsigned int event); | ||||
| 	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Viresh Kumar
				Viresh Kumar