|| ||Arve Hjønnevåg <arve-AT-android.com> |
|| ||"Rafael J. Wysocki" <rjw-AT-sisk.pl> |
|| ||Re: [RFC][PATCH] PM: Avoid losing wakeup events during suspend |
|| ||Mon, 21 Jun 2010 17:50:18 -0700|
|| ||Alan Stern <stern-AT-rowland.harvard.edu>,
Florian Mickler <florian-AT-mickler.org>,
Linux-pm mailing list <linux-pm-AT-lists.linux-foundation.org>,
Matthew Garrett <mjg59-AT-srcf.ucam.org>,
Linux Kernel Mailing List <linux-kernel-AT-vger.kernel.org>,
Dmitry Torokhov <dmitry.torokhov-AT-gmail.com>,
Neil Brown <neilb-AT-suse.de>, mark gross <640e9920-AT-gmail.com>|
|| ||Article, Thread
On Mon, Jun 21, 2010 at 3:40 PM, Rafael J. Wysocki <firstname.lastname@example.org> wrote:
> On Tuesday, June 22, 2010, Alan Stern wrote:
>> On Mon, 21 Jun 2010, Florian Mickler wrote:
>> > > In the end you would want to have communication in both directions:
>> > > suspend blockers _and_ callbacks. Â Polling is bad if done too often.
>> > > But I think the idea is a good one.
>> > Actually, I'm not so shure.
>> > 1. you have to roundtrip whereas in the suspend_blocker scheme you have
>> > active annotations (i.e. no further action needed)
>> That's why it's best to use both. Â The normal case is that programs
>> activate and deactivate blockers by sending one-way messages to the PM
>> process. Â The exceptional case is when the PM process is about to
>> initiate a suspend; that's when it does the round-trip polling. Â Since
>> the only purpose of the polling is to avoid a race, 90% of the time it
>> will succeed.
>> > 2. it may not be possible for a user to determine if a wake-event is
>> > in-flight. you would have to somehow pass the wake-event-number with
>> > it, so that the userspace process could ack it properly without
>> > confusion. Or... I don't know of anything else...
>> > Â Â 1. userspace-manager (UM) reads a number (42).
>> > Â Â 2. it questions userspace program X: is it ok to suspend?
>> > Â Â [please fill in how userspace program X determines to block
>> > Â Â suspend]
>> > Â Â 3a. UM's roundtrip ends and it proceeds to write "42" to the
>> > Â Â kernel [suspending]
>> > Â Â 3b. UM's roundtrip ends and it aborts suspend, because a
>> > Â Â (userspace-)suspend-blocker got activated
>> > I'm not shure how the userspace program could determine that there is a
>> > wake-event in flight. Perhaps by storing the number of last wake-event.
>> > But then you need per-wake-event-counters... :|
>> Rafael seems to think timeouts will fix this. Â I'm not so sure.
>> > Do you have some thoughts about the wake-event-in-flight detection?
>> Not really, except for something like the original wakelock scheme in
>> which the kernel tells the PM core when an event is over.
> But the kernel doesn't really know that, so it really can't tell the PM core
> anything useful. Â What happens with suspend blockers is that a kernel suspend
> cooperates with a user space consumer of the event to get the story straight.
> However, that will only work if the user space is not buggy and doesn't crash,
> for example, before releasing the suspend blocker it's holding.
> Apart from this, there are those events withoug user space "handoff" that
> use timeouts.
> Also there are events like wake-on-LAN that can be regarded as instantaneous
> from the power manager's point of view, so they don't really need all of the
> "suspend blockers" machinery and for them we will need to use a cooldown
> timeout anyway.
> And if we need to use that cooldown timeout, I don't see why not to use
> timeouts for avoiding the race you're worrying about.
Just because some events need to use timeouts, does not mean that all
events should use timeouts. You may even want different timeout for
different events. If I want a 5 minute timeout after a wake-on-lan
packet, I don't want the same timeout after every battery check alarm
(every 10 minutes on the Nexus One).
Also, I don't see how this patch helps with events that never make
reach user-space. Unless each driver blocks suspend by returning and
error from its suspend hook, the driver then becomes dependent on the
user-space power manager to choose a sufficiently long timeout. For
some drivers, like the gpio keypad matrix driver there, is no safe
value for the timeout. The keypad driver has to block suspend if any
keys are held down.
I won't have time to actively follow this discussion, but I don't
think this patch is a good solution.
to post comments)