mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	cpufreq: intel_pstate: Fix sysfs limits enforcement for performance policy
A side effect of keeping intel_pstate sysfs limits in sync with cpufreq
is that the now sysfs limits can't enforced under performance policy.
For example, if the max_perf_pct is changed from 100 to 80, this will call
intel_pstate_set_policy(), which will change the max_perf to 100 again for
performance policy. Same issue happens, when no_turbo is set.
This change calculates max and min frequency using sysfs performance
limits in intel_pstate_verify_policy() and adjusts policy limits by
calling cpufreq_verify_within_limits().
Also, it causes the setting of performance limits to be skipped if
no_turbo is set.
Fixes: 111b8b3fe4 (cpufreq: intel_pstate: Always keep all limits settings in sync)
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									e11b6293a8
								
							
						
					
					
						commit
						1443ebbacf
					
				
					 1 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1951,7 +1951,8 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
 | 
			
		|||
			limits = &performance_limits;
 | 
			
		||||
			perf_limits = limits;
 | 
			
		||||
		}
 | 
			
		||||
		if (policy->max >= policy->cpuinfo.max_freq) {
 | 
			
		||||
		if (policy->max >= policy->cpuinfo.max_freq &&
 | 
			
		||||
		    !limits->no_turbo) {
 | 
			
		||||
			pr_debug("set performance\n");
 | 
			
		||||
			intel_pstate_set_performance_limits(perf_limits);
 | 
			
		||||
			goto out;
 | 
			
		||||
| 
						 | 
				
			
			@ -1993,6 +1994,17 @@ static int intel_pstate_verify_policy(struct cpufreq_policy *policy)
 | 
			
		|||
	    policy->policy != CPUFREQ_POLICY_PERFORMANCE)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	/* When per-CPU limits are used, sysfs limits are not used */
 | 
			
		||||
	if (!per_cpu_limits) {
 | 
			
		||||
		unsigned int max_freq, min_freq;
 | 
			
		||||
 | 
			
		||||
		max_freq = policy->cpuinfo.max_freq *
 | 
			
		||||
						limits->max_sysfs_pct / 100;
 | 
			
		||||
		min_freq = policy->cpuinfo.max_freq *
 | 
			
		||||
						limits->min_sysfs_pct / 100;
 | 
			
		||||
		cpufreq_verify_within_limits(policy, min_freq, max_freq);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue