All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: "Arve Hjønnevåg" <arve@android.com>
Cc: ncunningham@crca.org.au, u.luckas@road.de, swetland@google.com,
	linux-pm@lists.linux-foundation.org
Subject: Re: [PATCH 01/13] PM: Add wake lock api.
Date: Mon, 9 Feb 2009 01:15:10 +0100	[thread overview]
Message-ID: <200902090115.10896.rjw@sisk.pl> (raw)
In-Reply-To: <d6200be20902071620o2012e80es272745f98345b656@mail.gmail.com>

On Sunday 08 February 2009, Arve Hjønnevåg wrote:
> On Sat, Feb 7, 2009 at 3:25 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > On Saturday 07 February 2009, Arve Hjønnevåg wrote:
> >> On Sat, Feb 7, 2009 at 10:56 AM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> >> > If my understanding is correct, a wakelock is a mechanism that, if held, will
> >> > prevent the system from (automatically) entering a sleep state, but why do we
> >> > need a number of such wakelocks instead of just one reference counter with the
> >> > rule that (automatic) suspend can only happen if the counter is zero?
> >>
> >> Using wakelocks instead of a global reference count ensures that your
> >> request cannot be cleared by someone else.
> >
> > Decreasing the refcount without increasing it would have been a bug, IMO.
> 
> Yes, but if all you have is a global reference count, you can't tell
> where the bug is.

Still, in the kernel we use reference counts all over the place.

> >> It means that you can, without knowing the current state of the lock, safely
> >> call wake_lock when you know that you need the wakelock, and
> >> wake_unlock when you are done.
> >
> > You can do the same with a reference counter IMO.
> 
> Not without some per lock state.

What prevents me from increasing the reference counter when necessary and
decreasing it when I'm done, actually?

> >> It allows wakelocks with timeouts
> >
> > OK
> >
> > What for?
> 
> So we do not have to change everything at once, and so we can allow
> code that we do not really trust a chance to run.

Well, are you sure this is the best way of achieving this goal?

> >> and detailed stats.
> >
> > Well, I'm not sure how this is useful in the long run.
> 
> You may want to know which app drained your battery.
> 
> >> > Then, code paths wanting to prevent the suspend from happening would only need
> >> > to increase the counter and it shouldn't be difficult to provide a user space
> >> > interface for that.
> >>
> >> No, but you would also need to provide way to decrement it, which
> >> would allow user-space to override a request to stay awake in the
> >> kernel or from another client.
> >
> > OK, that's a good reason.
> >
> > However, it might be better to use a refcount along with some mechanism
> > allowing user space processes to increase it only once before decreasing.
> > That would require a per-task flag, but I think you can reuse one of the
> > freezer flags for that (the freezer is not going to run as long as a wakelock
> > is held, right?).
> 
> How would this be better?

Simpler code, less overhead.  But I'm not insisting, just showing you another
possible approach.

> >> >> +This works whether the wakelock is already held or not. It is useful if the
> >> >> +driver woke up other parts of the system that do not use wakelocks but
> >> >> +still need to run. Avoid this when possible, since it will waste power
> >> >> +if the timeout is long or may fail to finish needed work if the timeout is
> >> >> +short.
> >> >
> >> > And what's this call needed for?
> >
> > Please don't remove the context.  This makes reading your reply difficult.
> 
>  +It can also call wake_lock_timeout to release the wakelock after a delay:
>  +     wake_lock_timeout(&state->wakelock, HZ);
>  +
> 
> >
> >> It is needed to give code that do not use wakelocks a chance to run.
> >> For instance we have not added wakelocks to the network stack. We also
> >> use it in some places when passing data to untrusted userspace code.
> >
> > Do you mean to take a wakelock with a timeout in one code path so that some
> > other code path can run knowing that suspend will not happen?
> >
> > If this is correct, I don't like it, because it's inherently unreliable (you
> > really never know how long it will take the other code path to run, so you
> > can't choose the timeout 100% accurately).
> 
> I agree, but without wakelock support you have two options. Do not
> user suspend at all, or use a global timeout that you reset everywhere
> we lock a wakelock. By using wakelocks with timeouts we can at least
> make some events 100% reliable.

I'm not convinced.

Sorry to say that, but IMO the "wakelock with timeout" mechanism looks more
like a (poor) workaround than a solution of the problem.  Surely, I woulnd't
have tried to introduce anything similar into the kernel.

> >
> > I really would use a refcount and make sure it's increased (and obviously
> > decreased) by _every_ code path that needs to prevent suspend from happening,
> > including networking and so on.
> >
> >> > Is there a mechanism allowing us to see what wakelocks have been created by
> >> > the user land?  Something like this would be useful for debugging.
> >>
> >> /proc/wakelocks shows all wakelocks. It does not currently indicate if
> >> a wakelock is from userspace, but if you are looking for a specific
> >> lock it is easy to find. I can add a prefix to the name of all user
> >> space wakelocks of you want.
> >
> > Well, actually, do the wakelocks have to have the names?
> 
> If you want to debug the system or provide stats, yes.

Care to elaborate?

> >> >> +/* wake_lock_active returns a non-zero value if the wake_lock is currently
> >> >> + * locked. If the wake_lock has a timeout, it does not check the timeout,
> >> >> + * but if the timeout had already expired when it was checked elsewhere
> >> >> + * this function will return 0.
> >> >> + */
> >> >> +int wake_lock_active(struct wake_lock *lock);
> >> >
> >> > What's the purpose of this function?
> >>
> >> It is used by our alarm driver to abort suspend.
> >
> > In what way, exactly?
> 
> The alarm driver sets an rtc alarm on suspend. After grabbing its
> state lock it, checks if the wakelock is active. Since the wakelock
> implementation now prevents suspend in a suspend_late hook when
> wakelocks are held, this may not be strictly necessary anymore, but
> prevents the alarm driver from having to deal with the state of being
> suspended while an alarm is pending.

OK, thanks.

> >> >> +/* has_wake_lock returns 0 if no wake locks of the specified type are active,
> >> >> + * and non-zero if one or more wake locks are held. Specifically it returns
> >> >> + * -1 if one or more wake locks with no timeout are active or the
> >> >> + * number of jiffies until all active wake locks time out.
> >> >> + */
> >> >> +long has_wake_lock(int type);
> >
> > Well, it should be called max_wake_lock_timeout() or something like this.
> 
> I called it has_wake_lock since most of the clients do not care about
> the timeout. I think "if(has_wake_lock(" is easier to read than
> "if(max_wake_lock_timeout(".
> 
> >
> >> > And this?
> >>
> >> It is used to abort suspend. Currently when freezing processes, but it
> >> could also be called between each driver suspend call to improve
> >> wakeup latency when a wakelock is locked while suspending.
> >>
> >> We also use it (with WAKE_LOCK_IDLE) to select the idle sleep mode.
> >
> > OK, but it is not supposed to be used by device drivers, right?
> 
> No, it is only used by generic or machine specific power management code.

Your original description seemed to imply that it was a part of the API
available to device drivers.

Thanks,
Rafael

  parent reply	other threads:[~2009-02-09  0:15 UTC|newest]

Thread overview: 192+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-05  2:50 [RFC][PATCH 00/11] Android PM extensions Arve Hjønnevåg
2009-02-05  2:50 ` [PATCH 01/13] PM: Add wake lock api Arve Hjønnevåg
2009-02-05  2:50   ` [PATCH 02/13] PM: Add early suspend api Arve Hjønnevåg
2009-02-05  2:50     ` [PATCH 03/13] PM: Implement wakelock api Arve Hjønnevåg
2009-02-05  2:50       ` [PATCH 04/13] PM: wakelock: Override wakelocks when using /sys/power/state Arve Hjønnevåg
2009-02-05  2:50         ` [PATCH 05/13] PM: Add option to disable /sys/power/state interface Arve Hjønnevåg
2009-02-05  2:50           ` [PATCH 06/13] PM: Implement early suspend api Arve Hjønnevåg
2009-02-05  2:50             ` [PATCH 07/13] PM: wakelock: Add /sys/power/request_state Arve Hjønnevåg
2009-02-05  2:50               ` [PATCH 08/13] PM: Add user-space wake lock api Arve Hjønnevåg
2009-02-05  2:50                 ` [PATCH 09/13] PM: wakelock: Abort task freezing if a wake lock is held Arve Hjønnevåg
2009-02-05  2:50                   ` [PATCH 10/13] PM: earlysuspend: Add console switch when user requested sleep state changes Arve Hjønnevåg
2009-02-05  2:50                     ` [PATCH 11/13] PM: earlysuspend: Removing dependence on console Arve Hjønnevåg
2009-02-05  2:50                       ` [PATCH 12/13] Input: Hold wake lock while event queue is not empty Arve Hjønnevåg
2009-02-05  2:50                         ` [PATCH 13/13] ledtrig-sleep: Add led trigger for sleep debugging Arve Hjønnevåg
2009-02-05  9:08                         ` [PATCH 12/13] Input: Hold wake lock while event queue is not empty Pavel Machek
2009-02-05  9:06                       ` [PATCH 11/13] PM: earlysuspend: Removing dependence on console Pavel Machek
2009-02-05  9:42                         ` Arve Hjønnevåg
2009-02-05  9:53                           ` Pavel Machek
2009-02-05  9:03                     ` [PATCH 10/13] PM: earlysuspend: Add console switch when user requested sleep state changes Pavel Machek
2009-02-05  9:37                       ` Arve Hjønnevåg
2009-02-05  9:51                         ` Pavel Machek
2009-02-05 10:54                         ` Uli Luckas
2009-02-06  2:29                       ` Arve Hjønnevåg
2009-02-08 22:02                         ` Pavel Machek
2009-02-08 22:53                           ` Arve Hjønnevåg
2009-02-08 22:58                             ` Pavel Machek
2009-02-05  8:55                   ` [PATCH 09/13] PM: wakelock: Abort task freezing if a wake lock is held Pavel Machek
2009-02-05  9:30                     ` Arve Hjønnevåg
2009-02-05  9:49                       ` Pavel Machek
2009-02-05  9:58                         ` Arve Hjønnevåg
2009-02-05 10:02                           ` Pavel Machek
2009-02-05 10:08                             ` Arve Hjønnevåg
2009-02-06  3:42                             ` Arve Hjønnevåg
2009-02-08 23:00                               ` Pavel Machek
2009-02-06  0:35                   ` mark gross
2009-02-05  8:53                 ` [PATCH 08/13] PM: Add user-space wake lock api Pavel Machek
2009-02-05  8:52               ` [PATCH 07/13] PM: wakelock: Add /sys/power/request_state Pavel Machek
2009-02-05  9:25                 ` Arve Hjønnevåg
2009-02-05  9:27                   ` Pavel Machek
2009-02-07 22:54               ` Rafael J. Wysocki
2009-02-06  0:18             ` [PATCH 06/13] PM: Implement early suspend api mark gross
2009-02-07 22:47             ` Rafael J. Wysocki
2009-02-08  2:32               ` Benjamin Herrenschmidt
2009-02-08 13:33                 ` Rafael J. Wysocki
2009-02-05  9:17           ` [PATCH 05/13] PM: Add option to disable /sys/power/state interface Pavel Machek
2009-02-07 22:37           ` Rafael J. Wysocki
2009-02-08 10:33             ` Pavel Machek
2009-02-08 13:50               ` Rafael J. Wysocki
2009-02-08 14:04                 ` Brian Swetland
2009-02-08 21:06                   ` Pavel Machek
2009-02-08 23:41                     ` Rafael J. Wysocki
2009-02-09  1:58                       ` Uli Luckas
2009-02-10  0:09                         ` Rafael J. Wysocki
2009-02-08 23:40                   ` Rafael J. Wysocki
2009-02-08 23:58                     ` Arve Hjønnevåg
2009-02-09  0:26                       ` Rafael J. Wysocki
2009-02-09  1:35                         ` Arve Hjønnevåg
2009-02-09  1:53                           ` Brian Swetland
2009-02-09  8:58                             ` Pavel Machek
2009-02-09 13:31                               ` Brian Swetland
2009-02-10 11:19                                 ` Pavel Machek
2009-02-09  9:15                           ` Pavel Machek
2009-02-09  3:07                       ` Alan Stern
2009-02-11 22:26                         ` Rafael J. Wysocki
2009-02-09  9:09                       ` Pavel Machek
2009-02-12 11:16                   ` Matthew Garrett
2009-02-08 21:04                 ` Pavel Machek
2009-02-08 21:40                   ` Alan Stern
2009-02-08 23:00                     ` Arve Hjønnevåg
2009-02-08 23:03                       ` Pavel Machek
2009-02-09  0:31                         ` Rafael J. Wysocki
2009-02-09  2:11                           ` Uli Luckas
2009-02-09  2:24                             ` Arve Hjønnevåg
2009-02-09  2:56                               ` Uli Luckas
2009-02-09  9:01                           ` Pavel Machek
2009-02-10  0:17                             ` Rafael J. Wysocki
2009-02-10  9:13                               ` Pavel Machek
2009-02-10 14:18                                 ` Rafael J. Wysocki
2009-02-08 23:41                                   ` Pavel Machek
2009-02-08 23:44                     ` Rafael J. Wysocki
2009-02-08 23:44                   ` Rafael J. Wysocki
2009-02-07 22:31         ` [PATCH 04/13] PM: wakelock: Override wakelocks when using /sys/power/state Rafael J. Wysocki
2009-02-05  9:16       ` [PATCH 03/13] PM: Implement wakelock api Pavel Machek
2009-02-05 15:24       ` Alan Stern
2009-02-06  0:10       ` mark gross
2009-02-06  0:38         ` Arve Hjønnevåg
2009-02-07  0:33           ` mark gross
2009-02-07  0:47             ` Arve Hjønnevåg
2009-02-09 18:00               ` mark gross
2009-02-10 20:24               ` Pavel Machek
2009-02-07 22:27       ` Rafael J. Wysocki
2009-02-11  2:52         ` Arve Hjønnevåg
2009-02-05  9:14     ` [PATCH 02/13] PM: Add early suspend api Pavel Machek
2009-02-05 23:26     ` mark gross
2009-02-06  9:33       ` Uli Luckas
2009-02-06 23:26         ` Arve Hjønnevåg
2009-02-07 20:53     ` Rafael J. Wysocki
2009-02-07 23:34       ` Arve Hjønnevåg
2009-02-08 20:59         ` Pavel Machek
2009-02-08 23:59         ` Rafael J. Wysocki
2009-02-05  9:11   ` [PATCH 01/13] PM: Add wake lock api Pavel Machek
2009-02-06  0:28     ` Arve Hjønnevåg
2009-02-06  9:45       ` Uli Luckas
2009-02-08 21:30       ` Pavel Machek
2009-02-08 23:11         ` Arve Hjønnevåg
2009-02-09  9:06           ` Pavel Machek
2009-02-08 22:17       ` non-racy examples, please (was Re: [PATCH 01/13] PM: Add wake lock api.) Pavel Machek
2009-02-08 22:40         ` Arve Hjønnevåg
2009-02-08 23:14           ` Pavel Machek
2009-02-08 23:35             ` Arve Hjønnevåg
2009-02-10 11:15               ` Pavel Machek
2009-02-11  3:12                 ` Arve Hjønnevåg
2009-02-09  1:49         ` non-racy examples, please (was Re: [PATCH 01/13] PM: Add wake lock api. ) Uli Luckas
2009-02-10 11:17           ` non-racy examples, please (was Re: [PATCH 01/13] PM: Add wake lock?api.) Pavel Machek
2009-02-10 12:10             ` Woodruff, Richard
2009-02-10 13:14               ` Pavel Machek
2009-02-10 13:20                 ` Woodruff, Richard
2009-02-10 13:42                   ` Brian Swetland
2009-02-10 12:35             ` Uli Luckas
2009-02-06  1:32     ` [PATCH 01/13] PM: Add wake lock api mark gross
2009-02-05 22:51   ` mark gross
2009-02-06  0:13     ` Arve Hjønnevåg
2009-02-10 20:25       ` Pavel Machek
2009-02-11  2:11         ` Arve Hjønnevåg
2009-02-11  4:47         ` Brian Swetland
2009-02-11  8:40           ` Uli Luckas
2009-02-11 14:58           ` Alan Stern
2009-02-11 15:45             ` Rafael J. Wysocki
2009-02-08 22:57               ` Pavel Machek
2009-02-11 21:37             ` Pavel Machek
2009-02-11 22:05               ` Alan Stern
2009-02-11 23:55               ` Arve Hjønnevåg
2009-02-12 18:47           ` mark gross
2009-02-07 18:56   ` Rafael J. Wysocki
2009-02-07 22:51     ` Arve Hjønnevåg
2009-02-07 23:25       ` Rafael J. Wysocki
2009-02-08  0:20         ` Arve Hjønnevåg
2009-02-08 21:21           ` Pavel Machek
2009-02-09  0:03             ` Rafael J. Wysocki
2009-02-09  0:15           ` Rafael J. Wysocki [this message]
2009-02-09  2:03             ` Arve Hjønnevåg
2009-02-11 22:23               ` Rafael J. Wysocki
2009-02-11 23:42                 ` Arve Hjønnevåg
2009-02-12 22:22                   ` Rafael J. Wysocki
2009-02-12 23:42                     ` Woodruff, Richard
2009-02-13  1:10                       ` Matthew Garrett
2009-02-13  2:21                         ` Arve Hjønnevåg
2009-02-13  2:40                           ` Nigel Cunningham
2009-02-13  3:17                         ` Woodruff, Richard
2009-02-13 10:55                         ` Uli Luckas
2009-02-13 14:06                           ` Matthew Garrett
2009-02-13 14:24                             ` Brian Swetland
2009-02-13 14:37                               ` Matthew Garrett
2009-02-13 14:46                                 ` Brian Swetland
2009-02-13 15:07                                   ` Matthew Garrett
2009-02-13 22:52                                     ` Rafael J. Wysocki
2009-02-13 16:46                                 ` Uli Luckas
2009-02-13 17:05                                   ` Matthew Garrett
2009-02-13 18:13                                     ` Uli Luckas
2009-02-13 19:14                                       ` Matthew Garrett
2009-02-13 19:35                                         ` Uli Luckas
2009-02-13 16:49                             ` Uli Luckas
2009-02-13 17:09                               ` Matthew Garrett
2009-02-13 18:18                                 ` Uli Luckas
2009-02-27 13:18                               ` Pavel Machek
2009-02-27 14:07                                 ` Uli Luckas
2009-02-27 20:32                                   ` Pavel Machek
2009-03-02 13:53                                     ` Uli Luckas
2009-03-03 14:02                                       ` Pavel Machek
2009-03-04 13:41                                         ` Uli Luckas
2009-03-04 14:00                                         ` Uli Luckas
2009-03-04 14:13                                           ` Pavel Machek
2009-03-04 14:34                                             ` Uli Luckas
2009-03-04 17:10                                               ` Pavel Machek
2009-03-05 17:42                                                 ` Uli Luckas
2009-03-08  8:32                                                   ` Pavel Machek
2009-03-08 12:34                                                     ` Alan Stern
2009-02-13 23:36                             ` Arve Hjønnevåg
2009-02-14  0:05                               ` Matthew Garrett
2009-02-14  0:50                                 ` Arve Hjønnevåg
2009-02-14  1:06                                   ` Matthew Garrett
2009-02-14  1:33                                     ` Arve Hjønnevåg
2009-02-14  1:49                                       ` Matthew Garrett
2009-02-14  5:51                                         ` Arve Hjønnevåg
2009-02-14 20:44                                           ` Matthew Garrett
2009-02-26 15:04                         ` Pavel Machek
2009-02-26 21:11                           ` Arve Hjønnevåg
2009-02-26 21:36                             ` Pavel Machek
2009-02-27  0:16                               ` Arve Hjønnevåg
2009-02-27  9:56                                 ` Pavel Machek
2009-02-28  3:20                                   ` Arve Hjønnevåg
2009-02-06 23:51 ` [RFC][PATCH 00/11] Android PM extensions 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=200902090115.10896.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=arve@android.com \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=ncunningham@crca.org.au \
    --cc=swetland@google.com \
    --cc=u.luckas@road.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 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.