forked from mirrors/linux
		
	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);
 | 
											policy->cpu, event);
 | 
				
			||||||
	ret = policy->governor->governor(policy, 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
 | 
						/* we keep one module reference alive for
 | 
				
			||||||
			each CPU governed by this CPU */
 | 
								each CPU governed by this CPU */
 | 
				
			||||||
	if ((event != CPUFREQ_GOV_START) || ret)
 | 
						if ((event != CPUFREQ_GOV_START) || ret)
 | 
				
			||||||
| 
						 | 
					@ -1585,6 +1588,7 @@ int cpufreq_register_governor(struct cpufreq_governor *governor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&cpufreq_governor_mutex);
 | 
						mutex_lock(&cpufreq_governor_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						governor->initialized = 0;
 | 
				
			||||||
	err = -EBUSY;
 | 
						err = -EBUSY;
 | 
				
			||||||
	if (__find_governor(governor->name) == NULL) {
 | 
						if (__find_governor(governor->name) == NULL) {
 | 
				
			||||||
		err = 0;
 | 
							err = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -254,11 +254,6 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
 | 
				
			||||||
			return rc;
 | 
								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
 | 
							 * conservative does not implement micro like ondemand
 | 
				
			||||||
		 * governor, thus we are bound to jiffes/HZ
 | 
							 * 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_register_notifier(cs_ops->notifier_block,
 | 
				
			||||||
					CPUFREQ_TRANSITION_NOTIFIER);
 | 
										CPUFREQ_TRANSITION_NOTIFIER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			dbs_data->min_sampling_rate = MIN_SAMPLING_RATE_RATIO *
 | 
								if (!policy->governor->initialized)
 | 
				
			||||||
				jiffies_to_usecs(10);
 | 
									dbs_data->min_sampling_rate =
 | 
				
			||||||
 | 
										MIN_SAMPLING_RATE_RATIO *
 | 
				
			||||||
 | 
										jiffies_to_usecs(10);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			od_dbs_info->rate_mult = 1;
 | 
								od_dbs_info->rate_mult = 1;
 | 
				
			||||||
			od_dbs_info->sample_type = OD_NORMAL_SAMPLE;
 | 
								od_dbs_info->sample_type = OD_NORMAL_SAMPLE;
 | 
				
			||||||
			od_ops->powersave_bias_init_cpu(cpu);
 | 
								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 */
 | 
							/* Bring kernel and HW constraints together */
 | 
				
			||||||
		dbs_data->min_sampling_rate = max(dbs_data->min_sampling_rate,
 | 
							dbs_data->min_sampling_rate = max(dbs_data->min_sampling_rate,
 | 
				
			||||||
				MIN_LATENCY_MULTIPLIER * latency);
 | 
									MIN_LATENCY_MULTIPLIER * latency);
 | 
				
			||||||
		*sampling_rate = max(dbs_data->min_sampling_rate, latency *
 | 
							*sampling_rate = max(dbs_data->min_sampling_rate, latency *
 | 
				
			||||||
				LATENCY_MULTIPLIER);
 | 
									LATENCY_MULTIPLIER);
 | 
				
			||||||
 | 
					unlock:
 | 
				
			||||||
		mutex_unlock(&dbs_data->mutex);
 | 
							mutex_unlock(&dbs_data->mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Initiate timer time stamp */
 | 
							/* 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 {
 | 
					struct cpufreq_governor {
 | 
				
			||||||
	char	name[CPUFREQ_NAME_LEN];
 | 
						char	name[CPUFREQ_NAME_LEN];
 | 
				
			||||||
 | 
						int	initialized;
 | 
				
			||||||
	int	(*governor)	(struct cpufreq_policy *policy,
 | 
						int	(*governor)	(struct cpufreq_policy *policy,
 | 
				
			||||||
				 unsigned int event);
 | 
									 unsigned int event);
 | 
				
			||||||
	ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy,
 | 
						ssize_t	(*show_setspeed)	(struct cpufreq_policy *policy,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue