From: Leo Yan <leo.yan@linaro.org>
To: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
"Peter Zijlstra (Intel)" <peterz@infradead.org>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
Vincent Guittot <vincent.guittot@linaro.org>,
Ramesh Thomas <ramesh.thomas@intel.com>,
linux-kernel@vger.kernel.org, Linux PM <linux-pm@vger.kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Subject: [PATCH v1 3/5] cpuidle: menu: Provide menu_decide_stopping_tick()
Date: Mon, 13 Aug 2018 00:09:29 +0800 [thread overview]
Message-ID: <1534090171-14464-4-git-send-email-leo.yan@linaro.org> (raw)
In-Reply-To: <1534090171-14464-1-git-send-email-leo.yan@linaro.org>
This patch is only for code refactoring and without functional change.
It introduces a new function menu_decide_stopping_tick(); we can use
this function to focus on making stopping tick decision. With moving
out stopping tick decision code, it lets the below piece code is
simplized only for the idle state calibration and thus save one indent
level in the loop.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
| 76 ++++++++++++++++++++++++++--------------
1 file changed, 50 insertions(+), 26 deletions(-)
--git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
index 83618ab..4f02207 100644
--- a/drivers/cpuidle/governors/menu.c
+++ b/drivers/cpuidle/governors/menu.c
@@ -276,6 +276,37 @@ static unsigned int get_typical_interval(struct menu_device *data)
}
/**
+ * menu_decide_stopping_tick - decides if need to stopping tick
+ * @drv: cpuidle driver containing state data
+ * @data: menu_device structure pointer
+ * @idx: the candidate idle state index
+ */
+static bool menu_decide_stopping_tick(struct cpuidle_driver *drv,
+ struct menu_device *data, int idx)
+{
+ /*
+ * If the tick has been stopped yet, force to stop it afterwards and
+ * don't give chance to set *stop_tick to false.
+ */
+ if (tick_nohz_tick_stopped())
+ return true;
+
+ /* Don't stop the tick if the selected state is a polling one */
+ if (drv->states[idx].flags & CPUIDLE_FLAG_POLLING)
+ return false;
+
+ /*
+ * Don't stop the tick if the prediction is shorter than the
+ * tick period length.
+ */
+ if (data->predicted_us < TICK_USEC)
+ return false;
+
+ /* Otherwise, let's stop the tick at this time. */
+ return true;
+}
+
+/**
* menu_select - selects the next idle state to enter
* @drv: cpuidle driver containing state data
* @dev: the CPU
@@ -396,33 +427,26 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
if (idx == -1)
idx = 0; /* No states enabled. Must use 0. */
- /*
- * Don't stop the tick if the selected state is a polling one or if the
- * expected idle duration is shorter than the tick period length.
- */
- if (((drv->states[idx].flags & CPUIDLE_FLAG_POLLING) ||
- data->predicted_us < TICK_USEC) && !tick_nohz_tick_stopped()) {
-
- *stop_tick = false;
+ *stop_tick = menu_decide_stopping_tick(drv, data, idx);
- if (idx > 0 &&
- drv->states[idx].target_residency > data->tick_delta_us) {
- /*
- * The tick is not going to be stopped and the target
- * residency of the state to be returned is not within
- * the time until the next timer event including the
- * tick, so try to correct that.
- */
- for (i = idx - 1; i >= 0; i--) {
- if (drv->states[i].disabled ||
- dev->states_usage[i].disable)
- continue;
-
- idx = i;
- if (drv->states[i].target_residency <=
- data->tick_delta_us)
- break;
- }
+ /* Calibrate the idle state according to the tick event. */
+ if (!*stop_tick && idx > 0 &&
+ drv->states[idx].target_residency > data->tick_delta_us) {
+ /*
+ * The tick is not going to be stopped and the target
+ * residency of the state to be returned is not within
+ * the time until the next timer event including the
+ * tick, so try to correct that.
+ */
+ for (i = idx - 1; i >= 0; i--) {
+ if (drv->states[i].disabled ||
+ dev->states_usage[i].disable)
+ continue;
+
+ idx = i;
+ if (drv->states[i].target_residency <=
+ data->tick_delta_us)
+ break;
}
}
--
2.7.4
next prev parent reply other threads:[~2018-08-12 16:09 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-12 16:09 [PATCH v1 0/5] Improvement stopping tick decision making in 'menu' idle governor Leo Yan
2018-08-12 16:09 ` [PATCH v1 1/5] cpuidle: menu: Clean up variables usage in menu_select() Leo Yan
2018-08-21 8:32 ` Rafael J. Wysocki
2018-08-12 16:09 ` [PATCH v1 2/5] cpuidle: menu: Record tick delta value in struct menu_device Leo Yan
2018-08-21 8:34 ` Rafael J. Wysocki
2018-08-12 16:09 ` Leo Yan [this message]
2018-08-12 16:09 ` [PATCH v1 4/5] cpuidle: menu: Don't stay in shallow state for a long time Leo Yan
2018-08-21 8:35 ` Rafael J. Wysocki
2018-08-12 16:09 ` [PATCH v1 5/5] cpuidle: menu: Change to compare prediction with tick delta Leo Yan
2018-08-21 8:37 ` [PATCH v1 0/5] Improvement stopping tick decision making in 'menu' idle governor 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=1534090171-14464-4-git-send-email-leo.yan@linaro.org \
--to=leo.yan@linaro.org \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rafael.j.wysocki@intel.com \
--cc=ramesh.thomas@intel.com \
--cc=vincent.guittot@linaro.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).