From: "Li, Aubrey" <aubrey.li@linux.intel.com>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>, Aubrey Li <aubrey.li@intel.com>
Cc: tglx@linutronix.de, peterz@infradead.org, len.brown@intel.com,
ak@linux.intel.com, tim.c.chen@linux.intel.com,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v2 3/8] cpuidle: add a new predict interface
Date: Mon, 16 Oct 2017 16:04:15 +0800 [thread overview]
Message-ID: <70eb3c82-a486-e1dd-05ce-d968b857e86b@linux.intel.com> (raw)
In-Reply-To: <2353480.vFnqZDvmsB@aspire.rjw.lan>
On 2017/10/14 8:45, Rafael J. Wysocki wrote:
> On Saturday, September 30, 2017 9:20:29 AM CEST Aubrey Li wrote:
>> For the governor has predict functionality, add a new predict
>> interface in cpuidle framework to call and use it.
>
> Care to describe how it is intended to work?
>
> Also this patch uses data structures introduced in the previous one
> (and the previous one didn't use them), so maybe merge the two?
okay, will refine in the next version.
>
>> ---
>> drivers/cpuidle/cpuidle.c | 34 ++++++++++++++++++++++++++++++++++
>> drivers/cpuidle/governors/menu.c | 7 +++++++
>> include/linux/cpuidle.h | 3 +++
>> kernel/sched/idle.c | 1 +
>> 4 files changed, 45 insertions(+)
>>
>> diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
>> index 4066308..ef6f7dd 100644
>> --- a/drivers/cpuidle/cpuidle.c
>> +++ b/drivers/cpuidle/cpuidle.c
>> @@ -336,6 +336,40 @@ void cpuidle_entry_end(void)
>> }
>>
>> /**
>> + * cpuidle_predict - predict whether the coming idle is a fast idle or not
>> + */
>> +void cpuidle_predict(void)
>> +{
>> + struct cpuidle_device *dev = cpuidle_get_device();
>> + unsigned int overhead_threshold;
>> +
>> + if (!dev)
>> + return;
>> +
>> + overhead_threshold = dev->idle_stat.overhead;
>> +
>> + if (cpuidle_curr_governor->predict) {
>> + dev->idle_stat.predicted_us = cpuidle_curr_governor->predict();
>> + /*
>> + * notify idle governor to avoid reduplicative
>> + * prediction computation
>> + */
>
> This comment is hard to understand.
>
> What does it mean, really?
>
predict() does a lot of computation. If it's called in cpuidle_predict(),
we don't want it to be called in menu governor again. So here I use a flag to
tell menu governor if predict computation is already done for the coming idle
this time.
>> + dev->idle_stat.predicted = true;
>> + if (dev->idle_stat.predicted_us < overhead_threshold) {
>> + /*
>> + * notify tick subsystem to keep ticking
>> + * for the coming idle
>> + */
>> + dev->idle_stat.fast_idle = true;
>> + } else
>> + dev->idle_stat.fast_idle = false;
>
> What about
>
> dev->idle_stat.fast_idle = dev->idle_stat.predicted_us < overhead_threshold;
Ack
>
> Also why don't you use dev->idle_stat.overhead directly here?
Yeah, I should merge a few patches, because dev->idle_stat.overhead is referenced many times,
for irq timings, for scheduler idle statistics and for idle governor.
>
> And what is the basic idea here? Why do we compare the predicted
> idle duration with the entry/exit overhead from the previous cycle
> (if I understood this correctly, that is)?
entry/exit overhead is an average here, and the variance should not be big.
>
>> + } else {
>> + dev->idle_stat.predicted = false;
>> + dev->idle_stat.fast_idle = false;
>> + }
>> +}
>> +
>> +/**
>> * cpuidle_install_idle_handler - installs the cpuidle idle loop handler
>> */
>> void cpuidle_install_idle_handler(void)
>> diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
>> index 6bed197..90b2a10 100644
>> --- a/drivers/cpuidle/governors/menu.c
>> +++ b/drivers/cpuidle/governors/menu.c
>> @@ -344,6 +344,12 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
>> if (unlikely(latency_req == 0))
>> return 0;
>>
>> + /*don't predict again if idle framework already did it */
>> + if (!dev->idle_stat.predicted)
>> + menu_predict();
>> + else
>> + dev->idle_stat.predicted = false;
>
> We provide the callback which is going to be used by the core if present,
> so why would the core not use it after all?
There is a case that in the loop
while (!need_resched()) {
cpuidle_idle_call()
}
The CPU receives a timer interrupt and wake up and find nothing to be scheduled
and back to call menu then mwait to sleep again.
Under this case, cpuidle_predict() is not reached but the idle data for the
prediction needs to be updated.
Thanks,
-Aubrey
next prev parent reply other threads:[~2017-10-16 8:04 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-30 7:20 [RFC PATCH v2 0/8] Introduct cpu idle prediction functionality Aubrey Li
2017-09-30 7:20 ` [RFC PATCH v2 1/8] cpuidle: menu: extract " Aubrey Li
2017-10-14 0:26 ` Rafael J. Wysocki
2017-10-16 2:46 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 2/8] cpuidle: record the overhead of idle entry Aubrey Li
2017-10-14 0:35 ` Rafael J. Wysocki
2017-10-16 3:11 ` Li, Aubrey
2017-10-17 0:05 ` Rafael J. Wysocki
2017-10-17 7:04 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 3/8] cpuidle: add a new predict interface Aubrey Li
2017-10-14 0:45 ` Rafael J. Wysocki
2017-10-16 8:04 ` Li, Aubrey [this message]
2017-10-14 1:27 ` Rafael J. Wysocki
2017-10-16 9:52 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 4/8] tick/nohz: keep tick on for a fast idle Aubrey Li
2017-10-14 0:51 ` Rafael J. Wysocki
2017-10-16 3:26 ` Li, Aubrey
2017-10-16 4:45 ` Mike Galbraith
2017-10-16 5:34 ` Li, Aubrey
2017-10-16 6:25 ` Mike Galbraith
2017-10-16 6:31 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 5/8] timers: keep sleep length updated as needed Aubrey Li
2017-10-14 0:56 ` Rafael J. Wysocki
2017-10-16 6:46 ` Li, Aubrey
2017-10-16 23:58 ` Rafael J. Wysocki
2017-10-17 6:10 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 6/8] cpuidle: make fast idle threshold tunable Aubrey Li
2017-10-14 0:59 ` Rafael J. Wysocki
2017-10-16 6:00 ` Li, Aubrey
2017-10-17 0:01 ` Rafael J. Wysocki
2017-10-17 6:12 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 7/8] cpuidle: introduce irq timing to make idle prediction Aubrey Li
2017-10-14 1:01 ` Rafael J. Wysocki
2017-10-16 6:03 ` Li, Aubrey
2017-09-30 7:20 ` [RFC PATCH v2 8/8] cpuidle: introduce run queue average idle " Aubrey Li
2017-10-14 1:02 ` Rafael J. Wysocki
2017-10-14 1:14 ` [RFC PATCH v2 0/8] Introduct cpu idle prediction functionality Rafael J. Wysocki
2017-10-16 7:44 ` Li, Aubrey
2017-10-17 0:07 ` Rafael J. Wysocki
2017-10-17 7:32 ` Li, Aubrey
2017-11-30 1:00 ` Li, Aubrey
2017-11-30 1:37 ` 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=70eb3c82-a486-e1dd-05ce-d968b857e86b@linux.intel.com \
--to=aubrey.li@linux.intel.com \
--cc=ak@linux.intel.com \
--cc=aubrey.li@intel.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
--cc=tim.c.chen@linux.intel.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.