cpufreq: intel_pstate: Update the maximum CPU frequency consistently
There are 3 places at which the maximum CPU frequency may change, store_no_turbo(), intel_pstate_update_limits() (when called by the cpufreq core) and intel_pstate_notify_work() (when handling a HWP change notification). Currently, cpuinfo.max_freq is only updated by store_no_turbo() and intel_pstate_notify_work(), although it principle it may be necessary to update it in intel_pstate_update_limits() either. Make all of them mutually consistent. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
This commit is contained in:
parent
f32587dcbe
commit
e8217b4bec
1 changed files with 18 additions and 5 deletions
|
@ -1153,18 +1153,32 @@ static void intel_pstate_update_policies(void)
|
||||||
static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
|
static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
|
||||||
struct cpufreq_policy *policy)
|
struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
|
intel_pstate_get_hwp_cap(cpudata);
|
||||||
|
|
||||||
policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
|
policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
|
||||||
cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
|
cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
|
||||||
|
|
||||||
refresh_frequency_limits(policy);
|
refresh_frequency_limits(policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_pstate_update_limits(unsigned int cpu)
|
static void intel_pstate_update_limits(unsigned int cpu)
|
||||||
{
|
{
|
||||||
mutex_lock(&intel_pstate_driver_lock);
|
struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpu);
|
||||||
|
|
||||||
cpufreq_update_policy(cpu);
|
if (!policy)
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_unlock(&intel_pstate_driver_lock);
|
__intel_pstate_update_max_freq(all_cpu_data[cpu], policy);
|
||||||
|
|
||||||
|
cpufreq_cpu_release(policy);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void intel_pstate_update_limits_for_all(void)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
for_each_possible_cpu(cpu)
|
||||||
|
intel_pstate_update_limits(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************** sysfs begin ************************/
|
/************************** sysfs begin ************************/
|
||||||
|
@ -1311,7 +1325,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,
|
||||||
|
|
||||||
mutex_unlock(&intel_pstate_limits_lock);
|
mutex_unlock(&intel_pstate_limits_lock);
|
||||||
|
|
||||||
intel_pstate_update_policies();
|
intel_pstate_update_limits_for_all();
|
||||||
arch_set_max_freq_ratio(no_turbo);
|
arch_set_max_freq_ratio(no_turbo);
|
||||||
|
|
||||||
unlock_driver:
|
unlock_driver:
|
||||||
|
@ -1595,7 +1609,6 @@ static void intel_pstate_notify_work(struct work_struct *work)
|
||||||
struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpudata->cpu);
|
struct cpufreq_policy *policy = cpufreq_cpu_acquire(cpudata->cpu);
|
||||||
|
|
||||||
if (policy) {
|
if (policy) {
|
||||||
intel_pstate_get_hwp_cap(cpudata);
|
|
||||||
__intel_pstate_update_max_freq(cpudata, policy);
|
__intel_pstate_update_max_freq(cpudata, policy);
|
||||||
|
|
||||||
cpufreq_cpu_release(policy);
|
cpufreq_cpu_release(policy);
|
||||||
|
|
Loading…
Add table
Reference in a new issue