From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: tglx@linutronix.de, peterz@infradead.org, rafael@kernel.org,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
vincent.guittot@linaro.org
Subject: Re: [RFC PATCH 2/2] sched: idle: IRQ based next prediction for idle period
Date: Sun, 10 Jan 2016 23:58:42 +0100 [thread overview]
Message-ID: <5692E222.6060905@linaro.org> (raw)
In-Reply-To: <alpine.LFD.2.20.1601101739270.7882@knanqh.ubzr>
On 01/10/2016 11:46 PM, Nicolas Pitre wrote:
> On Sun, 10 Jan 2016, Daniel Lezcano wrote:
>
>> On 01/06/2016 06:40 PM, Nicolas Pitre wrote:
>>> On Wed, 6 Jan 2016, Daniel Lezcano wrote:
>>>
>>>> Many IRQs are quiet most of the time, or they tend to come in bursts of
>>>> fairly equal time intervals within each burst. It is therefore possible
>>>> to detect those IRQs with stable intervals and guestimate when the next
>>>> IRQ event is most likely to happen.
>>>>
>>>> Examples of such IRQs may include audio related IRQs where the FIFO size
>>>> and/or DMA descriptor size with the sample rate create stable intervals,
>>>> block devices during large data transfers, etc. Even network streaming
>>>> of multimedia content creates patterns of periodic network interface IRQs
>>>> in some cases.
>>>>
>>>> This patch adds code to track the mean interval and variance for each IRQ
>>>> over a window of time intervals between IRQ events. Those statistics can
>>>> be used to assist cpuidle in selecting the most appropriate sleep state
>>>> by predicting the most likely time for the next interrupt.
>>>>
>>>> Because the stats are gathered in interrupt context, the core computation
>>>> is as light as possible.
>>>>
>>>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>>
>> [ ... ]
>>
>>>> +
>>>> + diff = ktime_sub(now, w->timestamp);
>>>> +
>>>> + /*
>>>> + * There is no point attempting predictions on interrupts more
>>>> + * than 1 second apart. This has no benefit for sleep state
>>>> + * selection and increases the risk of overflowing our
>>>> variance
>>>> + * computation. Reset all stats in that case.
>>>> + */
>>>> + if (unlikely(ktime_after(diff, ktime_set(1, 0)))) {
>>>> + stats_reset(&w->stats);
>>>> + continue;
>>>> + }
>>>
>>> The above is wrong. It is not computing the interval between successive
>>> interruts but rather the interval between the last interrupt occurrence
>>> and the present time (i.e. when we're about to go idle). This won't
>>> prevent interrupt intervals greater than one second from being summed
>>> and potentially overflowing the variance if this code is executed less
>>> than a second after one such IRQ interval. This test should rather be
>>> performed in sched_idle_irq().
>>
>> Hi Nico,
>>
>> I have been through here again and think we should duplicate the test because
>> there are two cases:
>>
>> 1. We did not go idle and the interval measured in sched_idle_irq is more than
>> one second, then the stats are reset. I suggest to use an approximation of one
>> second: (diff < (1 << 20)) as we are in the fast
>> path.
>>
>> 2. We are going idle and the latest interrupt happened one second apart from
>> now. So we keep the current test.
>
> You don't need the current test if the interval is already limited
> earlier on. Predictions that would otherwise trip that test will target
> a time in the past and be discarded.
Yes, but that wake up source should be discarded in the process of the
selection, so ignored in the loop, otherwise it can end up as the next
event (which is obviously wrong) and discarded at the end by returning
KTIME_MAX, instead of giving the opportunity to find another interrupt
as the next event with a greater value.
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
next prev parent reply other threads:[~2016-01-10 22:58 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-06 15:22 [RFC PATCH 0/2] IRQ based next prediction Daniel Lezcano
2016-01-06 15:22 ` [RFC PATCH 1/2] irq: Add a framework to measure interrupt timings Daniel Lezcano
2016-01-08 15:31 ` Thomas Gleixner
2016-01-12 11:42 ` Daniel Lezcano
2016-01-06 15:22 ` [RFC PATCH 2/2] sched: idle: IRQ based next prediction for idle period Daniel Lezcano
2016-01-06 17:40 ` Nicolas Pitre
2016-01-07 15:42 ` Daniel Lezcano
2016-01-12 19:27 ` Nicolas Pitre
2016-01-10 22:37 ` Daniel Lezcano
2016-01-10 22:46 ` Nicolas Pitre
2016-01-10 22:58 ` Daniel Lezcano [this message]
2016-01-10 23:13 ` Nicolas Pitre
2016-01-08 15:43 ` Thomas Gleixner
2016-01-12 12:41 ` Daniel Lezcano
2016-01-12 13:42 ` Thomas Gleixner
2016-01-12 14:16 ` Daniel Lezcano
2016-01-12 14:26 ` Thomas Gleixner
2016-01-12 14:52 ` Daniel Lezcano
2016-01-12 15:12 ` Thomas Gleixner
2016-01-12 16:04 ` Daniel Lezcano
2016-01-13 9:17 ` Thomas Gleixner
2016-01-18 13:21 ` Daniel Lezcano
2016-01-20 15:41 ` Thomas Gleixner
2016-01-20 16:00 ` [RFC V2 0/2] IRQ based next prediction Daniel Lezcano
2016-01-20 16:00 ` [RFC V2 1/2] irq: Add a framework to measure interrupt timings Daniel Lezcano
2016-01-20 17:55 ` Thomas Gleixner
2016-01-21 9:25 ` Daniel Lezcano
2016-01-21 10:27 ` Thomas Gleixner
2016-01-20 19:07 ` Peter Zijlstra
2016-01-20 19:57 ` Thomas Gleixner
2016-01-20 20:04 ` Nicolas Pitre
2016-01-20 20:20 ` Peter Zijlstra
2016-01-20 20:22 ` Thomas Gleixner
2016-01-21 9:50 ` Daniel Lezcano
2016-01-21 10:08 ` Peter Zijlstra
2016-01-21 12:38 ` Daniel Lezcano
2016-01-21 20:27 ` Thomas Gleixner
2016-01-21 13:52 ` Thomas Gleixner
2016-01-21 14:19 ` Daniel Lezcano
2016-01-21 18:56 ` Thomas Gleixner
2016-01-22 10:15 ` Peter Zijlstra
2016-01-21 9:26 ` Daniel Lezcano
2016-01-20 19:28 ` Peter Zijlstra
2016-01-21 9:53 ` Daniel Lezcano
2016-01-20 16:00 ` [RFC V2 2/2] sched: idle: IRQ based next prediction for idle period Daniel Lezcano
2016-01-20 17:46 ` Nicolas Pitre
2016-01-20 18:44 ` Peter Zijlstra
2016-01-21 10:03 ` Daniel Lezcano
2016-01-20 19:02 ` Peter Zijlstra
2016-01-20 19:17 ` Nicolas Pitre
2016-01-20 19:29 ` Peter Zijlstra
2016-01-20 19:34 ` Peter Zijlstra
2016-01-20 19:40 ` Peter Zijlstra
2016-01-20 19:57 ` Nicolas Pitre
2016-01-20 20:22 ` Peter Zijlstra
2016-01-20 19:49 ` Thomas Gleixner
2016-01-21 13:54 ` Daniel Lezcano
2016-01-21 14:12 ` Thomas Gleixner
2016-01-20 16:00 ` [RFC V2 0/2] IRQ based next prediction Daniel Lezcano
2016-01-20 16:00 ` [RFC V2 1/2] irq: Add a framework to measure interrupt timings Daniel Lezcano
2016-01-20 16:00 ` [RFC V2 2/2] sched: idle: IRQ based next prediction for idle period Daniel Lezcano
2016-01-20 20:14 ` Nicolas Pitre
2016-01-21 13:04 ` Daniel Lezcano
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=5692E222.6060905@linaro.org \
--to=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=nicolas.pitre@linaro.org \
--cc=peterz@infradead.org \
--cc=rafael@kernel.org \
--cc=tglx@linutronix.de \
--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).