From: Ulf Hansson <ulf.hansson@linaro.org>
To: "Rafael J . Wysocki" <rafael@kernel.org>, linux-pm@vger.kernel.org
Cc: Kevin Hilman <khilman@baylibre.com>,
Pavel Machek <pavel@kernel.org>, Len Brown <len.brown@intel.com>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
Saravana Kannan <saravanak@google.com>,
Maulik Shah <quic_mkshah@quicinc.com>,
Prasad Sodagudi <psodagud@quicinc.com>,
Ulf Hansson <ulf.hansson@linaro.org>,
linux-kernel@vger.kernel.org
Subject: [RFC/PATCH 2/3] pmdomain: Respect the system-wakeup QoS limit at system-wide suspend
Date: Wed, 16 Jul 2025 14:33:18 +0200 [thread overview]
Message-ID: <20250716123323.65441-3-ulf.hansson@linaro.org> (raw)
In-Reply-To: <20250716123323.65441-1-ulf.hansson@linaro.org>
A system-wakeup QoS limit may have been requested by user-space. To avoid
entering a too deep state for PM domains that are managed my genpd, let's
start to take into account the QoS limit when selecting the
low-power-state.
If it turns out that none of the states in the list of domain-idlestates
are suitable to use, let's leave the PM domain powered-on.
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
---
drivers/pmdomain/core.c | 10 ++++++++--
drivers/pmdomain/governor.c | 23 +++++++++++++++++++++++
include/linux/pm_domain.h | 1 +
3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
index a86aeda1c955..5cbe7473c2b9 100644
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
@@ -1396,8 +1396,14 @@ static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock,
return;
}
- /* Choose the deepest state when suspending */
- genpd->state_idx = genpd->state_count - 1;
+ if (genpd->gov && genpd->gov->system_power_down_ok) {
+ if (!genpd->gov->system_power_down_ok(&genpd->domain))
+ return;
+ } else {
+ /* Default to the deepest state. */
+ genpd->state_idx = genpd->state_count - 1;
+ }
+
if (_genpd_power_off(genpd, false)) {
genpd->states[genpd->state_idx].rejected++;
return;
diff --git a/drivers/pmdomain/governor.c b/drivers/pmdomain/governor.c
index 39359811a930..2630ba6f28ef 100644
--- a/drivers/pmdomain/governor.c
+++ b/drivers/pmdomain/governor.c
@@ -343,6 +343,27 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
return _default_power_down_ok(pd, ktime_get());
}
+static bool default_system_power_down_ok(struct dev_pm_domain *pd)
+{
+ s64 constraint_ns = system_wakeup_latency_qos_limit() * NSEC_PER_USEC;
+ struct generic_pm_domain *genpd = pd_to_genpd(pd);
+ int state_idx = genpd->state_count - 1;
+
+ /* Find the deepest state for the latency constraint. */
+ while (state_idx >= 0) {
+ s64 latency_ns = genpd->states[state_idx].power_off_latency_ns +
+ genpd->states[state_idx].power_on_latency_ns;
+
+ if (latency_ns <= constraint_ns) {
+ genpd->state_idx = state_idx;
+ return true;
+ }
+ state_idx--;
+ }
+
+ return false;
+}
+
#ifdef CONFIG_CPU_IDLE
static bool cpu_power_down_ok(struct dev_pm_domain *pd)
{
@@ -418,12 +439,14 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd)
struct dev_power_governor pm_domain_cpu_gov = {
.suspend_ok = default_suspend_ok,
.power_down_ok = cpu_power_down_ok,
+ .system_power_down_ok = default_system_power_down_ok,
};
#endif
struct dev_power_governor simple_qos_governor = {
.suspend_ok = default_suspend_ok,
.power_down_ok = default_power_down_ok,
+ .system_power_down_ok = default_system_power_down_ok,
};
/*
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index 99556589f45e..0ad14cc4ad7f 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -140,6 +140,7 @@ enum genpd_sync_state {
};
struct dev_power_governor {
+ bool (*system_power_down_ok)(struct dev_pm_domain *domain);
bool (*power_down_ok)(struct dev_pm_domain *domain);
bool (*suspend_ok)(struct device *dev);
};
--
2.43.0
next prev parent reply other threads:[~2025-07-16 12:33 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-16 12:33 [RFC/PATCH 0/3] PM: QoS: Introduce a system-wakeup QoS limit for s2idle and genpd Ulf Hansson
2025-07-16 12:33 ` [RFC/PATCH 1/3] PM: QoS: Introduce a system-wakeup QoS limit Ulf Hansson
2025-07-21 16:39 ` Rafael J. Wysocki
2025-08-11 17:15 ` Kevin Hilman
2025-08-11 19:16 ` Rafael J. Wysocki
2025-08-12 9:26 ` Ulf Hansson
2025-09-12 13:57 ` Ulf Hansson
2025-09-17 19:24 ` Rafael J. Wysocki
2025-09-18 15:33 ` Ulf Hansson
2025-09-22 18:55 ` Rafael J. Wysocki
2025-09-23 9:42 ` Ulf Hansson
2025-09-23 11:38 ` Rafael J. Wysocki
2025-09-23 12:36 ` Ulf Hansson
2025-09-23 16:43 ` Dhruva Gole
2025-09-25 10:24 ` Ulf Hansson
2025-07-16 12:33 ` Ulf Hansson [this message]
2025-07-16 12:33 ` [RFC/PATCH 3/3] cpuidle: Respect the system-wakeup QoS limit for s2idle Ulf Hansson
2025-07-21 16:04 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250716123323.65441-3-ulf.hansson@linaro.org \
--to=ulf.hansson@linaro.org \
--cc=daniel.lezcano@linaro.org \
--cc=khilman@baylibre.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=pavel@kernel.org \
--cc=psodagud@quicinc.com \
--cc=quic_mkshah@quicinc.com \
--cc=rafael@kernel.org \
--cc=saravanak@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.