Message ID | 1665283.zxI7kaGBi8@kreacher (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | cpufreq: intel_pstate: Implement passive mode with HWP enabled | expand |
"Rafael J. Wysocki" <rjw@rjwysocki.net> writes: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > Move the locking away from intel_pstate_set_energy_pref_index() > into its only caller and drop the (now redundant) return_pref label > from it. > > Also move the "raw" EPP value check into the caller of that function, > so as to do it before acquiring the mutex, and reduce code duplication > related to the "raw" EPP values processing somewhat. > > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Francisco Jerez <currojerez@riseup.net> > --- > > v2 -> v3: > > * Fix error handling in intel_pstate_set_energy_pref_index() and > rebase. > > v3 -> v4: No changes > > --- > drivers/cpufreq/intel_pstate.c | 35 +++++++++++++++-------------------- > 1 file changed, 15 insertions(+), 20 deletions(-) > > Index: linux-pm/drivers/cpufreq/intel_pstate.c > =================================================================== > --- linux-pm.orig/drivers/cpufreq/intel_pstate.c > +++ linux-pm/drivers/cpufreq/intel_pstate.c > @@ -649,28 +649,18 @@ static int intel_pstate_set_energy_pref_ > if (!pref_index) > epp = cpu_data->epp_default; > > - mutex_lock(&intel_pstate_limits_lock); > - > if (boot_cpu_has(X86_FEATURE_HWP_EPP)) { > u64 value; > > ret = rdmsrl_on_cpu(cpu_data->cpu, MSR_HWP_REQUEST, &value); > if (ret) > - goto return_pref; > + return ret; > > value &= ~GENMASK_ULL(31, 24); > > - if (use_raw) { > - if (raw_epp > 255) { > - ret = -EINVAL; > - goto return_pref; > - } > - value |= (u64)raw_epp << 24; > - ret = wrmsrl_on_cpu(cpu_data->cpu, MSR_HWP_REQUEST, value); > - goto return_pref; > - } > - > - if (epp == -EINVAL) > + if (use_raw) > + epp = raw_epp; > + else if (epp == -EINVAL) > epp = epp_values[pref_index - 1]; > > value |= (u64)epp << 24; > @@ -680,8 +670,6 @@ static int intel_pstate_set_energy_pref_ > epp = (pref_index - 1) << 2; > ret = intel_pstate_set_epb(cpu_data->cpu, epp); > } > -return_pref: > - mutex_unlock(&intel_pstate_limits_lock); > > return ret; > } > @@ -708,8 +696,8 @@ static ssize_t store_energy_performance_ > struct cpudata *cpu_data = all_cpu_data[policy->cpu]; > char str_preference[21]; > bool raw = false; > + ssize_t ret; > u32 epp = 0; > - int ret; > > ret = sscanf(buf, "%20s", str_preference); > if (ret != 1) > @@ -724,14 +712,21 @@ static ssize_t store_energy_performance_ > if (ret) > return ret; > > + if (epp > 255) > + return -EINVAL; > + > raw = true; > } > > + mutex_lock(&intel_pstate_limits_lock); > + > ret = intel_pstate_set_energy_pref_index(cpu_data, ret, raw, epp); > - if (ret) > - return ret; > + if (!ret) > + ret = count; > > - return count; > + mutex_unlock(&intel_pstate_limits_lock); > + > + return ret; > } > > static ssize_t show_energy_performance_preference(
Index: linux-pm/drivers/cpufreq/intel_pstate.c =================================================================== --- linux-pm.orig/drivers/cpufreq/intel_pstate.c +++ linux-pm/drivers/cpufreq/intel_pstate.c @@ -649,28 +649,18 @@ static int intel_pstate_set_energy_pref_ if (!pref_index) epp = cpu_data->epp_default; - mutex_lock(&intel_pstate_limits_lock); - if (boot_cpu_has(X86_FEATURE_HWP_EPP)) { u64 value; ret = rdmsrl_on_cpu(cpu_data->cpu, MSR_HWP_REQUEST, &value); if (ret) - goto return_pref; + return ret; value &= ~GENMASK_ULL(31, 24); - if (use_raw) { - if (raw_epp > 255) { - ret = -EINVAL; - goto return_pref; - } - value |= (u64)raw_epp << 24; - ret = wrmsrl_on_cpu(cpu_data->cpu, MSR_HWP_REQUEST, value); - goto return_pref; - } - - if (epp == -EINVAL) + if (use_raw) + epp = raw_epp; + else if (epp == -EINVAL) epp = epp_values[pref_index - 1]; value |= (u64)epp << 24; @@ -680,8 +670,6 @@ static int intel_pstate_set_energy_pref_ epp = (pref_index - 1) << 2; ret = intel_pstate_set_epb(cpu_data->cpu, epp); } -return_pref: - mutex_unlock(&intel_pstate_limits_lock); return ret; } @@ -708,8 +696,8 @@ static ssize_t store_energy_performance_ struct cpudata *cpu_data = all_cpu_data[policy->cpu]; char str_preference[21]; bool raw = false; + ssize_t ret; u32 epp = 0; - int ret; ret = sscanf(buf, "%20s", str_preference); if (ret != 1) @@ -724,14 +712,21 @@ static ssize_t store_energy_performance_ if (ret) return ret; + if (epp > 255) + return -EINVAL; + raw = true; } + mutex_lock(&intel_pstate_limits_lock); + ret = intel_pstate_set_energy_pref_index(cpu_data, ret, raw, epp); - if (ret) - return ret; + if (!ret) + ret = count; - return count; + mutex_unlock(&intel_pstate_limits_lock); + + return ret; } static ssize_t show_energy_performance_preference(