From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: "Li, Aubrey" <aubrey.li@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
"Brown, Len" <len.brown@intel.com>,
"alan@linux.intel.com" <alan@linux.intel.com>,
LKML <linux-kernel@vger.kernel.org>,
Linux PM list <linux-pm@vger.kernel.org>
Subject: Re: [PATCH v3]PM/Sleep: Timer quiesce in freeze state
Date: Mon, 26 Jan 2015 15:41:44 +0100 [thread overview]
Message-ID: <2137807.aqSxQQCuJ3@vostro.rjw.lan> (raw)
In-Reply-To: <alpine.DEB.2.11.1501260946390.5526@nanos>
On Monday, January 26, 2015 10:40:24 AM Thomas Gleixner wrote:
> On Mon, 26 Jan 2015, Li, Aubrey wrote:
> > On 2015/1/22 18:15, Thomas Gleixner wrote:
[...]
> > >> + /*
> > >> + * cpuidle_enter will return with interrupt enabled
> > >> + */
> > >> + cpuidle_enter(drv, dev, next_state);
> > >
> > > How is that supposed to work?
> > >
> > > If timekeeping is not yet unfrozen, then any interrupt handling code
> > > which calls anything time related is going to hit lala land.
> > >
> > > You must guarantee that timekeeping is unfrozen before any interrupt
> > > is handled. If you cannot guarantee that, you cannot freeze
> > > timekeeping ever.
> > >
> > > The cpu local tick device is less critical, but it happens to work by
> > > chance, not by design.
> >
> > There are two way to guarantee this: the first way is, disable interrupt
> > before timekeeping frozen and enable interrupt after timekeeping is
> > unfrozen. However, we need to handle wakeup handler before unfreeze
> > timekeeping to wake freeze task up from wait queue.
> >
> > So we have to go the other way, the other way is, we ignore time related
> > calls during freeze, like what I added in irq_enter below.
>
> Groan. You just do not call in irq_enter/exit(), but what prevents any
> interrupt handler or whatever to call into the time/timer code after
> interrupts got reenabled?
>
> Nothing.
>
> > Or, we need to re-implement freeze wait and wake up mechanism?
>
> You need to make sure in the low level idle implementation that this
> cannot happen.
>
> tick_freeze()
> {
> raw_spin_lock(&tick_freeze_lock);
> tick_frozen++;
> if (tick_frozen == num_online_cpus())
> timekeeping_suspend();
> else
> tick_suspend_local();
> raw_spin_unlock(&tick_freeze_lock);
> }
>
> tick_unfreeze()
> {
> raw_spin_lock(&tick_freeze_lock);
> if (tick_frozen == num_online_cpus())
> timekeeping_resume();
> else
> tick_resume_local();
> tick_frozen--;
> raw_spin_unlock(&tick_freeze_lock);
> }
>
> idle_freeze()
> {
> local_irq_disable();
>
> tick_freeze();
>
> /* Must keep interrupts disabled! */
> go_deep_idle()
>
> tick_unfreeze();
>
> local_irq_enable();
> }
>
> That's the only way you can do it proper, everything else will just be
> a horrible mess of bandaids and duct tape.
>
> So that does not need any of the irq_enter/exit conditionals, it does
> not need the real_handler hack. It just works.
As long as go_deep_idle() above does not enable interrupts. This means we won't
be able to use some C-states for suspend-to-idle (hald-induced C1 on some x86
for one example), but that's not a very big deal.
> The only remaining issue might be a NMI calling into
> ktime_get_mono_fast_ns() before timekeeping is resumed. Its probably a
> non issue on x86/tsc, but it might be a problem on other platforms
> which turn off devices, clocks, It's not rocket science to prevent
> that.
I don't see any users of ktime_get_mono_fast_ns() at all, unless some non-trivial
macros are involved. At least grepping for it only returns the definition,
declarations and the line in trace.c.
Rafael
next prev parent reply other threads:[~2015-01-26 14:19 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-09 3:01 Li, Aubrey
2015-01-14 0:24 ` Li, Aubrey
2015-01-19 15:24 ` Rafael J. Wysocki
2015-01-22 10:15 ` Thomas Gleixner
2015-01-26 8:44 ` Li, Aubrey
2015-01-26 9:40 ` Thomas Gleixner
2015-01-26 14:21 ` Rafael J. Wysocki
2015-01-26 14:15 ` Thomas Gleixner
2015-01-26 14:45 ` Rafael J. Wysocki
2015-01-27 7:12 ` Li, Aubrey
2015-01-26 14:41 ` Rafael J. Wysocki [this message]
2015-01-26 14:24 ` Thomas Gleixner
2015-01-26 14:50 ` Rafael J. Wysocki
2015-01-26 14:34 ` Thomas Gleixner
2015-01-26 15:04 ` Rafael J. Wysocki
2015-01-27 8:03 ` Li, Aubrey
2015-01-27 15:10 ` Rafael J. Wysocki
2015-01-28 0:17 ` Li, Aubrey
2015-01-29 22:20 ` Rafael J. Wysocki
2015-02-06 1:20 ` [Update] " Rafael J. Wysocki
2015-02-06 16:14 ` Peter Zijlstra
2015-02-06 18:29 ` Peter Zijlstra
2015-02-06 22:36 ` Rafael J. Wysocki
2015-02-09 9:49 ` Peter Zijlstra
2015-02-09 14:50 ` Rafael J. Wysocki
2015-02-09 2:54 ` [Update 2x] " Rafael J. Wysocki
2015-02-09 15:20 ` Peter Zijlstra
2015-02-09 15:44 ` Peter Zijlstra
2015-02-09 23:57 ` 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=2137807.aqSxQQCuJ3@vostro.rjw.lan \
--to=rjw@rjwysocki.net \
--cc=alan@linux.intel.com \
--cc=aubrey.li@linux.intel.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/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
all inboxes | Powered by JetHome®