mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	cpuidle/menu: add per CPU PM QoS resume latency consideration
There may be special requirements on CPU response time, like if a interrupt is pinned to a CPU, that CPU should not go into excessively deep idle states. For this reason, add a mechanism for adding PM QoS resume latency constraints for individual CPUs and modify the menu governor to take them into account. To that end, extend the device PM QoS pm_qos_resume_latency attribute to CPUs, which is possible, because the exit latency for CPUs is effectively equivalent to the resume latency for devices. Signed-off-by: Alex Shi <alex.shi@linaro.org> Acked-by: Rik van Riel <riel@redhat.com> [ rjw : Subject & changelog ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
		
							parent
							
								
									8e37e1a2a3
								
							
						
					
					
						commit
						9908859aca
					
				
					 1 changed files with 7 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include <linux/tick.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/math64.h>
 | 
			
		||||
#include <linux/cpu.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Please note when changing the tuning values:
 | 
			
		||||
| 
						 | 
				
			
			@ -280,17 +281,23 @@ static unsigned int get_typical_interval(struct menu_device *data)
 | 
			
		|||
static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct menu_device *data = this_cpu_ptr(&menu_devices);
 | 
			
		||||
	struct device *device = get_cpu_device(dev->cpu);
 | 
			
		||||
	int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
 | 
			
		||||
	int i;
 | 
			
		||||
	unsigned int interactivity_req;
 | 
			
		||||
	unsigned int expected_interval;
 | 
			
		||||
	unsigned long nr_iowaiters, cpu_load;
 | 
			
		||||
	int resume_latency = dev_pm_qos_read_value(device);
 | 
			
		||||
 | 
			
		||||
	if (data->needs_update) {
 | 
			
		||||
		menu_update(drv, dev);
 | 
			
		||||
		data->needs_update = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* resume_latency is 0 means no restriction */
 | 
			
		||||
	if (resume_latency && resume_latency < latency_req)
 | 
			
		||||
		latency_req = resume_latency;
 | 
			
		||||
 | 
			
		||||
	/* Special case when user has set very strict latency requirement */
 | 
			
		||||
	if (unlikely(latency_req == 0))
 | 
			
		||||
		return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue