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
@ -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 New Issue
Block a user