cpufreq: intel_pstate: Update the maximum CPU frequency consistently
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 28 Mar 2024 18:52:45 +0000 (19:52 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 2 Apr 2024 10:57:22 +0000 (12:57 +0200)
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>
drivers/cpufreq/intel_pstate.c

index f1d6de05bcab4efd2526d79eee2fce01112f666f..02f9e494e86e0f70afd32e155f0f00e5926bd8f3 100644 (file)
@@ -1153,18 +1153,32 @@ static void intel_pstate_update_policies(void)
 static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
                                           struct cpufreq_policy *policy)
 {
+       intel_pstate_get_hwp_cap(cpudata);
+
        policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
                        cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
+
        refresh_frequency_limits(policy);
 }
 
 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 ************************/
@@ -1311,7 +1325,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,
 
        mutex_unlock(&intel_pstate_limits_lock);
 
-       intel_pstate_update_policies();
+       intel_pstate_update_limits_for_all();
        arch_set_max_freq_ratio(no_turbo);
 
 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);
 
        if (policy) {
-               intel_pstate_get_hwp_cap(cpudata);
                __intel_pstate_update_max_freq(cpudata, policy);
 
                cpufreq_cpu_release(policy);