forked from mirrors/linux
		
	intel_pstate: honor user space min_perf_pct override on resume
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> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									630ec286dd
								
							
						
					
					
						commit
						a04759924e
					
				
					 1 changed files with 11 additions and 3 deletions
				
			
		| 
						 | 
					@ -148,6 +148,8 @@ struct perf_limits {
 | 
				
			||||||
	int32_t min_perf;
 | 
						int32_t min_perf;
 | 
				
			||||||
	int max_policy_pct;
 | 
						int max_policy_pct;
 | 
				
			||||||
	int max_sysfs_pct;
 | 
						int max_sysfs_pct;
 | 
				
			||||||
 | 
						int min_policy_pct;
 | 
				
			||||||
 | 
						int min_sysfs_pct;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct perf_limits limits = {
 | 
					static struct perf_limits limits = {
 | 
				
			||||||
| 
						 | 
					@ -159,6 +161,8 @@ static struct perf_limits limits = {
 | 
				
			||||||
	.min_perf = 0,
 | 
						.min_perf = 0,
 | 
				
			||||||
	.max_policy_pct = 100,
 | 
						.max_policy_pct = 100,
 | 
				
			||||||
	.max_sysfs_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,
 | 
					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);
 | 
						ret = sscanf(buf, "%u", &input);
 | 
				
			||||||
	if (ret != 1)
 | 
						if (ret != 1)
 | 
				
			||||||
		return -EINVAL;
 | 
							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));
 | 
						limits.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (hwp_active)
 | 
						if (hwp_active)
 | 
				
			||||||
| 
						 | 
					@ -921,6 +927,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
 | 
						if (policy->policy == CPUFREQ_POLICY_PERFORMANCE &&
 | 
				
			||||||
	    policy->max >= policy->cpuinfo.max_freq) {
 | 
						    policy->max >= policy->cpuinfo.max_freq) {
 | 
				
			||||||
 | 
							limits.min_policy_pct = 100;
 | 
				
			||||||
		limits.min_perf_pct = 100;
 | 
							limits.min_perf_pct = 100;
 | 
				
			||||||
		limits.min_perf = int_tofp(1);
 | 
							limits.min_perf = int_tofp(1);
 | 
				
			||||||
		limits.max_policy_pct = 100;
 | 
							limits.max_policy_pct = 100;
 | 
				
			||||||
| 
						 | 
					@ -930,8 +937,9 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	limits.min_perf_pct = (policy->min * 100) / policy->cpuinfo.max_freq;
 | 
						limits.min_policy_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 = 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.min_perf = div_fp(int_tofp(limits.min_perf_pct), int_tofp(100));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;
 | 
						limits.max_policy_pct = (policy->max * 100) / policy->cpuinfo.max_freq;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue