From e3d73746230638fd50670d67843346ccaebb885b Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Alex Shi Date: Thu, 12 Jan 2017 21:27:04 +0800 Subject: [PATCH 19/26] cpuidle/menu: add per CPU PM QoS resume latency consideration [ commit 9908859acaa95640d4a07991a93f7cd5bfc18e02 from linux-stable ] 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 Acked-by: Rik van Riel [ rjw : Subject & changelog ] Signed-off-by: Rafael J. Wysocki Signed-off-by: Alex Kozyrev Signed-off-by: Jim Somerville --- drivers/cpuidle/governors/menu.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index eb9fb0e..fe2dcb8 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #define BUCKETS 12 @@ -259,10 +260,12 @@ again: static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) { struct menu_device *data = &__get_cpu_var(menu_devices); + struct device *device = get_cpu_device(dev->cpu); int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); int i; int multiplier; struct timespec t; + int resume_latency = dev_pm_qos_read_value(device); if (data->needs_update) { menu_update(drv, dev); @@ -271,6 +274,10 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev) data->exit_us = 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; -- 1.8.3.1