| From d8f469e9cff3bc4a6317d923e9506be046aa7bdc Mon Sep 17 00:00:00 2001 |
| From: Dirk Brandewie <dirk.j.brandewie@intel.com> |
| Date: Tue, 7 May 2013 08:20:26 -0700 |
| Subject: cpufreq / intel_pstate: use lowest requested max performance |
| |
| From: Dirk Brandewie <dirk.j.brandewie@intel.com> |
| |
| commit d8f469e9cff3bc4a6317d923e9506be046aa7bdc upstream. |
| |
| There are two ways that the maximum p-state can be clamped, via a |
| policy change and via the sysfs file. |
| |
| The acpi-thermal driver adjusts the p-state policy in response to |
| thermal events. These changes override the users settings at the |
| moment. |
| |
| Use the lowest of the two requested values this ensures that we will |
| not exceed the requested pstate from either mechanism. |
| |
| Reported-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| Signed-off-by: Dirk Brandewie <dirk.j.brandewie@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/cpufreq/intel_pstate.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/cpufreq/intel_pstate.c |
| +++ b/drivers/cpufreq/intel_pstate.c |
| @@ -117,6 +117,8 @@ struct perf_limits { |
| int min_perf_pct; |
| int32_t max_perf; |
| int32_t min_perf; |
| + int max_policy_pct; |
| + int max_sysfs_pct; |
| }; |
| |
| static struct perf_limits limits = { |
| @@ -125,6 +127,8 @@ static struct perf_limits limits = { |
| .max_perf = int_tofp(1), |
| .min_perf_pct = 0, |
| .min_perf = 0, |
| + .max_policy_pct = 100, |
| + .max_sysfs_pct = 100, |
| }; |
| |
| static inline void pid_reset(struct _pid *pid, int setpoint, int busy, |
| @@ -295,7 +299,8 @@ static ssize_t store_max_perf_pct(struct |
| if (ret != 1) |
| return -EINVAL; |
| |
| - limits.max_perf_pct = clamp_t(int, input, 0 , 100); |
| + limits.max_sysfs_pct = clamp_t(int, input, 0 , 100); |
| + limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct); |
| limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100)); |
| return count; |
| } |
| @@ -641,8 +646,9 @@ static int intel_pstate_set_policy(struc |
| limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100); |
| limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100)); |
| |
| - limits.max_perf_pct = policy->max * 100 / policy->cpuinfo.max_freq; |
| - limits.max_perf_pct = clamp_t(int, limits.max_perf_pct, 0 , 100); |
| + limits.max_policy_pct = policy->max * 100 / policy->cpuinfo.max_freq; |
| + limits.max_policy_pct = clamp_t(int, limits.max_policy_pct, 0 , 100); |
| + limits.max_perf_pct = min(limits.max_policy_pct, limits.max_sysfs_pct); |
| limits.max_perf = div_fp(int_tofp(limits.max_perf_pct), int_tofp(100)); |
| |
| if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) { |