From f316415fb209b0b29e74e02874a34c4f623d200a Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Tue, 13 Apr 2021 17:01:29 +0000 Subject: [PATCH] Revert "FROMLIST: PM / Domains: use device's next wakeup to determine domain idle state" This reverts commit 283e3271641ff0fd3067020f483db5b3857eca37. Drop [v6] patches in favor of upstream backports. Bug: 170654157 Signed-off-by: Carlos Llamas Change-Id: I82b8117cc6c6bf6b28af666f34257775ade428fa --- drivers/base/power/domain_governor.c | 102 +++------------------------ include/linux/pm_domain.h | 1 - 2 files changed, 9 insertions(+), 94 deletions(-) diff --git a/drivers/base/power/domain_governor.c b/drivers/base/power/domain_governor.c index 23b333fca6cc..f092eb306f42 100644 --- a/drivers/base/power/domain_governor.c +++ b/drivers/base/power/domain_governor.c @@ -119,55 +119,6 @@ static bool default_suspend_ok(struct device *dev) return td->cached_suspend_ok; } -static void update_domain_next_wakeup(struct generic_pm_domain *genpd, ktime_t now) -{ - ktime_t domain_wakeup = KTIME_MAX; - ktime_t next_wakeup; - struct pm_domain_data *pdd; - struct gpd_link *link; - - if (!genpd_may_use_next_wakeup(genpd)) - return; - - /* - * Devices that have a predictable wakeup pattern, may specify - * their next wakeup. Let's find the next wakeup from all the - * devices attached to this domain and from all the sub-domains. - * It is possible that component's a next wakeup may have become - * stale when we read that here. We will ignore to ensure the domain - * is able to enter its optimal idle state. - */ - list_for_each_entry(pdd, &genpd->dev_list, list_node) { - next_wakeup = to_gpd_data(pdd)->next_wakeup; - if (next_wakeup != KTIME_MAX && !ktime_before(next_wakeup, now)) - if (ktime_before(next_wakeup, domain_wakeup)) - domain_wakeup = next_wakeup; - } - - list_for_each_entry(link, &genpd->parent_links, parent_node) { - next_wakeup = link->child->next_wakeup; - if (next_wakeup != KTIME_MAX && !ktime_before(next_wakeup, now)) - if (ktime_before(next_wakeup, domain_wakeup)) - domain_wakeup = next_wakeup; - } - - genpd->next_wakeup = domain_wakeup; -} - -static bool next_wakeup_allows_state(struct generic_pm_domain *genpd, - unsigned int state, ktime_t now) -{ - ktime_t domain_wakeup = genpd->next_wakeup; - s64 idle_time_ns, min_sleep_ns; - - min_sleep_ns = genpd->states[state].power_off_latency_ns + - genpd->states[state].residency_ns; - - idle_time_ns = ktime_to_ns(ktime_sub(domain_wakeup, now)); - - return idle_time_ns >= min_sleep_ns; -} - static bool __default_power_down_ok(struct dev_pm_domain *pd, unsigned int state) { @@ -257,41 +208,16 @@ static bool __default_power_down_ok(struct dev_pm_domain *pd, } /** - * _default_power_down_ok - Default generic PM domain power off governor routine. + * default_power_down_ok - Default generic PM domain power off governor routine. * @pd: PM domain to check. * * This routine must be executed under the PM domain's lock. */ -static bool _default_power_down_ok(struct dev_pm_domain *pd, ktime_t now) +static bool default_power_down_ok(struct dev_pm_domain *pd) { struct generic_pm_domain *genpd = pd_to_genpd(pd); - int state_idx = genpd->state_count - 1; struct gpd_link *link; - /* - * Find the next wakeup from devices that can determine their own wakeup - * to find when the domain would wakeup and do it for every device down - * the hierarchy. It is not worth while to sleep if the state's residency - * cannot be met. - */ - update_domain_next_wakeup(genpd, now); - if (genpd->next_wakeup != KTIME_MAX) { - /* Let's find out the deepest domain idle state, the devices prefer */ - while (state_idx >= 0) { - if (next_wakeup_allows_state(genpd, state_idx, now)) { - genpd->max_off_time_changed = true; - break; - } - state_idx--; - } - - if (state_idx < 0) { - state_idx = 0; - genpd->cached_power_down_ok = false; - goto done; - } - } - if (!genpd->max_off_time_changed) { genpd->state_idx = genpd->cached_power_down_state_idx; return genpd->cached_power_down_ok; @@ -309,30 +235,21 @@ static bool _default_power_down_ok(struct dev_pm_domain *pd, ktime_t now) genpd->max_off_time_ns = -1; genpd->max_off_time_changed = false; genpd->cached_power_down_ok = true; + genpd->state_idx = genpd->state_count - 1; - /* - * Find a state to power down to, starting from the state - * determined by the next wakeup. - */ - while (!__default_power_down_ok(pd, state_idx)) { - if (state_idx == 0) { + /* Find a state to power down to, starting from the deepest. */ + while (!__default_power_down_ok(pd, genpd->state_idx)) { + if (genpd->state_idx == 0) { genpd->cached_power_down_ok = false; break; } - state_idx--; + genpd->state_idx--; } -done: - genpd->state_idx = state_idx; genpd->cached_power_down_state_idx = genpd->state_idx; return genpd->cached_power_down_ok; } -static bool default_power_down_ok(struct dev_pm_domain *pd) -{ - return _default_power_down_ok(pd, ktime_get()); -} - static bool always_on_power_down_ok(struct dev_pm_domain *domain) { return false; @@ -344,12 +261,11 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) struct generic_pm_domain *genpd = pd_to_genpd(pd); struct cpuidle_device *dev; ktime_t domain_wakeup, next_hrtimer; - ktime_t now = ktime_get(); s64 idle_duration_ns; int cpu, i; /* Validate dev PM QoS constraints. */ - if (!_default_power_down_ok(pd, now)) + if (!default_power_down_ok(pd)) return false; if (!(genpd->flags & GENPD_FLAG_CPU_DOMAIN)) @@ -371,7 +287,7 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd) } /* The minimum idle duration is from now - until the next wakeup. */ - idle_duration_ns = ktime_to_ns(ktime_sub(domain_wakeup, now)); + idle_duration_ns = ktime_to_ns(ktime_sub(domain_wakeup, ktime_get())); if (idle_duration_ns <= 0) return false; diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 9003bbfbab93..79b9c3ea5725 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -136,7 +136,6 @@ struct generic_pm_domain { unsigned int state); struct gpd_dev_ops dev_ops; s64 max_off_time_ns; /* Maximum allowed "suspended" time. */ - ktime_t next_wakeup; /* Maintained by the domain governor */ bool max_off_time_changed; bool cached_power_down_ok; bool cached_power_down_state_idx;