diff mbox

intel_pstate: honor user space min_perf_pct override on resume

Message ID 1422565432-11914-1-git-send-email-kristen@linux.intel.com (mailing list archive)
State Accepted, archived
Delegated to: Rafael Wysocki
Headers show

Commit Message

Kristen Carlson Accardi Jan. 29, 2015, 9:03 p.m. UTC
If the user has requested an override of the min_perf_pct via
sysfs, then it should be restored whenever policy is updated,
such as on resume.  Take the max of whatever the user requested
and whatever the policy is.

Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>
---
 drivers/cpufreq/intel_pstate.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

Comments

Rafael J. Wysocki Jan. 30, 2015, 11:09 p.m. UTC | #1
On Thursday, January 29, 2015 01:03:52 PM Kristen Carlson Accardi wrote:
> If the user has requested an override of the min_perf_pct via
> sysfs, then it should be restored whenever policy is updated,
> such as on resume.  Take the max of whatever the user requested
> and whatever the policy is.
> 
> Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com>

I've applied all of the recent intel_pstate patches from you (5 of them total).

> ---
>  drivers/cpufreq/intel_pstate.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
> index dfee572..e7e808d 100644
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -148,6 +148,8 @@ struct perf_limits {
>  	int32_t min_perf;
>  	int max_policy_pct;
>  	int max_sysfs_pct;
> +	int min_policy_pct;
> +	int min_sysfs_pct;
>  };
>  
>  static struct perf_limits limits = {
> @@ -159,6 +161,8 @@ static struct perf_limits limits = {
>  	.min_perf = 0,
>  	.max_policy_pct = 100,
>  	.max_sysfs_pct = 100,
> +	.min_policy_pct = 0,
> +	.min_sysfs_pct = 0,
>  };
>  
>  static inline void pid_reset(struct _pid *pid, int setpoint, int busy,
> @@ -431,7 +435,9 @@ static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b,
>  	ret = sscanf(buf, "%u", &input);
>  	if (ret != 1)
>  		return -EINVAL;
> -	limits.min_perf_pct = clamp_t(int, input, 0 , 100);
> +
> +	limits.min_sysfs_pct = clamp_t(int, input, 0 , 100);
> +	limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
>  	limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
>  
>  	if (hwp_active)
> @@ -921,6 +927,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
>  
>  	if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
>  	    policy->max >= policy->cpuinfo.max_freq) {
> +		limits.min_policy_pct = 100;
>  		limits.min_perf_pct = 100;
>  		limits.min_perf = int_tofp(1);
>  		limits.max_policy_pct = 100;
> @@ -930,8 +937,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
>  		return 0;
>  	}
>  
> -	limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
> -	limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100);
> +	limits.min_policy_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
> +	limits.min_policy_pct = clamp_t(int, limits.min_policy_pct, 0 , 100);
> +	limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
>  	limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
>  
>  	limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;
>
diff mbox

Patch

diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index dfee572..e7e808d 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -148,6 +148,8 @@  struct perf_limits {
 	int32_t min_perf;
 	int max_policy_pct;
 	int max_sysfs_pct;
+	int min_policy_pct;
+	int min_sysfs_pct;
 };
 
 static struct perf_limits limits = {
@@ -159,6 +161,8 @@  static struct perf_limits limits = {
 	.min_perf = 0,
 	.max_policy_pct = 100,
 	.max_sysfs_pct = 100,
+	.min_policy_pct = 0,
+	.min_sysfs_pct = 0,
 };
 
 static inline void pid_reset(struct _pid *pid, int setpoint, int busy,
@@ -431,7 +435,9 @@  static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b,
 	ret = sscanf(buf, "%u", &input);
 	if (ret != 1)
 		return -EINVAL;
-	limits.min_perf_pct = clamp_t(int, input, 0 , 100);
+
+	limits.min_sysfs_pct = clamp_t(int, input, 0 , 100);
+	limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
 	limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 
 	if (hwp_active)
@@ -921,6 +927,7 @@  static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 
 	if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
 	    policy->max >= policy->cpuinfo.max_freq) {
+		limits.min_policy_pct = 100;
 		limits.min_perf_pct = 100;
 		limits.min_perf = int_tofp(1);
 		limits.max_policy_pct = 100;
@@ -930,8 +937,9 @@  static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 		return 0;
 	}
 
-	limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
-	limits.min_perf_pct = clamp_t(int, limits.min_perf_pct, 0 , 100);
+	limits.min_policy_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
+	limits.min_policy_pct = clamp_t(int, limits.min_policy_pct, 0 , 100);
+	limits.min_perf_pct = max(limits.min_policy_pct, limits.min_sysfs_pct);
 	limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 
 	limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;