All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Andy Lutomirski <luto@amacapital.net>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>,
	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 23:16:56 +0200	[thread overview]
Message-ID: <20140814211656.GV19379@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <53ED263B.7030703@mit.edu>

[-- Attachment #1: Type: text/plain, Size: 2650 bytes --]

On Thu, Aug 14, 2014 at 02:12:27PM -0700, Andy Lutomirski wrote:
> 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.

They could and they probably should, but that logic should _not_ live in
the cpuidle driver.

And as stated elsewhere in the thread; they also need to fix their
kick_all_cpus_sync() usage, because that's similarly wrecked.

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

  reply	other threads:[~2014-08-14 21:17 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
2014-08-14 21:16         ` Peter Zijlstra [this message]
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=20140814211656.GV19379@twins.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --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=luto@amacapital.net \
    --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.