cpufreq: intel_pstate: Tweak the EPP sysfs interface
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 27 Aug 2020 12:32:12 +0000 (14:32 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 1 Sep 2020 19:14:06 +0000 (21:14 +0200)
Modify the EPP sysfs interface to reject attempts to change the EPP
to values different from 0 ("performance") in the active mode with
the "performance" policy (ie. scaling_governor set to "performance"),
to avoid situations in which the kernel appears to discard data
passed to it via the EPP sysfs attribute.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Documentation/admin-guide/pm/intel_pstate.rst
drivers/cpufreq/intel_pstate.c

index cdd1a9a7f9a29ba700904845026e50d5c41eeb7b..5072e7064d13d5ac8500ee94a97454f82346fd9a 100644 (file)
@@ -123,7 +123,9 @@ Energy-Performance Bias (EPB) knob (otherwise), which means that the processor's
 internal P-state selection logic is expected to focus entirely on performance.
 
 This will override the EPP/EPB setting coming from the ``sysfs`` interface
-(see `Energy vs Performance Hints`_ below).
+(see `Energy vs Performance Hints`_ below).  Moreover, any attempts to change
+the EPP/EPB to a value different from 0 ("performance") via ``sysfs`` in this
+configuration will be rejected.
 
 Also, in this configuration the range of P-states available to the processor's
 internal P-state selection logic is always restricted to the upper boundary
index e540448e0bd0c1c33034bad2f8a5c2569c5f50de..b308c39b62040c7eb6e0b441e84fad4904e74d3e 100644 (file)
@@ -684,6 +684,14 @@ static int intel_pstate_set_energy_pref_index(struct cpudata *cpu_data,
                else if (epp == -EINVAL)
                        epp = epp_values[pref_index - 1];
 
+               /*
+                * To avoid confusion, refuse to set EPP to any values different
+                * from 0 (performance) if the current policy is "performance",
+                * because those values would be overridden.
+                */
+               if (epp > 0 && cpu_data->policy == CPUFREQ_POLICY_PERFORMANCE)
+                       return -EBUSY;
+
                ret = intel_pstate_set_epp(cpu_data, epp);
        } else {
                if (epp == -EINVAL)