From: Andy Lutomirski <luto@amacapital.net>
To: Daniel Lezcano <daniel.lezcano@linaro.org>,
Peter Zijlstra <peterz@infradead.org>
Cc: Chuansheng Liu <chuansheng.liu@intel.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
changcheng.liu@intel.com, xiaoming.wang@intel.com,
souvik.k.chakravarty@intel.com
Subject: Re: [PATCH] cpuidle: Fix the CPU stuck at C0 for 2-3s after PM_QOS back to DEFAULT
Date: Thu, 14 Aug 2014 14:12:27 -0700 [thread overview]
Message-ID: <53ED263B.7030703@mit.edu> (raw)
In-Reply-To: <53EC9A29.8090408@linaro.org>
On 08/14/2014 04:14 AM, Daniel Lezcano wrote:
> On 08/14/2014 01:00 PM, Peter Zijlstra wrote:
>>
>> So seeing how you're from @intel.com I'm assuming you're using x86 here.
>>
>> I'm not seeing how this can be possible, MWAIT is interrupted by IPIs
>> just fine, which means we'll fall out of the cpuidle_enter(), which
>> means we'll cpuidle_reflect(), and then leave cpuidle_idle_call().
>>
>> It will indeed not leave the cpu_idle_loop() function and go right back
>> into cpuidle_idle_call(), but that will then call cpuidle_select() which
>> should pick a new C state.
>>
>> So the interrupt _should_ work. If it doesn't you need to explain why.
>
> I think the issue is related to the poll_idle state, in
> drivers/cpuidle/driver.c. This state is x86 specific and inserted in the
> cpuidle table as the state 0 (POLL). There is no mwait for this state.
> It is a bit confusing because this state is not listed in the acpi /
> intel idle driver but inserted implicitly at the beginning of the idle
> table by the cpuidle framework when the driver is registered.
>
> static int poll_idle(struct cpuidle_device *dev,
> struct cpuidle_driver *drv, int index)
> {
> local_irq_enable();
> if (!current_set_polling_and_test()) {
> while (!need_resched())
> cpu_relax();
> }
> current_clr_polling();
>
> return index;
> }
As the most recent person to have modified this function, and as an
avowed hater of pointless IPIs, let me ask a rather different question:
why are you sending IPIs at all? As of Linux 3.16, poll_idle actually
supports the polling idle interface :)
Can't you just do:
if (set_nr_if_polling(rq->idle)) {
trace_sched_wake_idle_without_ipi(cpu);
} else {
spin_lock_irqsave(&rq->lock, flags);
if (rq->curr == rq->idle)
smp_send_reschedule(cpu);
// else the CPU wasn't idle; nothing to do
raw_spin_unlock_irqrestore(&rq->lock, flags);
}
In the common case (wake from C0, i.e. polling idle), this will skip the
IPI entirely unless you race with idle entry/exit, saving a few more
precious electrons and all of the latency involved in poking the APIC
registers.
--Andy
P.S. "30mV" in the patch description is presumably a typo.
next prev parent reply other threads:[~2014-08-14 21:12 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-14 2:11 [PATCH] cpuidle: Fix the CPU stuck at C0 for 2-3s after PM_QOS back to DEFAULT Chuansheng Liu
[not found] ` <CAKnoXLw3DrBAxCUWEkXtvCTf+E1w0xTHJSiSUY6Qd6xHXeGaoQ@mail.gmail.com>
2014-08-14 10:53 ` Peter Zijlstra
2014-08-14 11:24 ` Liu, Chuansheng
2014-08-14 13:13 ` Peter Zijlstra
2014-08-14 14:10 ` Liu, Chuansheng
2014-08-14 14:17 ` Daniel Lezcano
2014-08-14 14:26 ` Liu, Chuansheng
2014-08-14 14:26 ` Liu, Chuansheng
2014-08-14 11:00 ` Peter Zijlstra
2014-08-14 11:14 ` Daniel Lezcano
2014-08-14 11:17 ` Liu, Chuansheng
2014-08-14 11:17 ` Liu, Chuansheng
2014-08-14 12:41 ` Peter Zijlstra
2014-08-14 13:29 ` Daniel Lezcano
2014-08-14 13:57 ` Liu, Chuansheng
2014-08-14 13:57 ` Liu, Chuansheng
2014-08-14 21:12 ` Andy Lutomirski [this message]
2014-08-14 21:16 ` Peter Zijlstra
2014-08-14 21:22 ` Andy Lutomirski
2014-08-15 1:21 ` Liu, Chuansheng
2014-08-15 1:21 ` Liu, Chuansheng
2014-08-15 1:27 ` Andy Lutomirski
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=53ED263B.7030703@mit.edu \
--to=luto@amacapital.net \
--cc=changcheng.liu@intel.com \
--cc=chuansheng.liu@intel.com \
--cc=daniel.lezcano@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=souvik.k.chakravarty@intel.com \
--cc=xiaoming.wang@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.